layout: post
title: SpringCloud RabbitMQ basic(一)
date: 2018-04-12 16:09:30.000000000 +09:00
categories: [SpringCloud]
tag: SpringCloud
AMQP
在異步通訊中,消息不會立刻到達(dá)接收方,而是被存放到一個容器中,當(dāng)滿足一定的條件之后,消息會被容器發(fā)送給接收方,這個容器即消息隊列,而完成這個功能需要雙方和容器以及其中的各個組件遵守統(tǒng)一的約定和規(guī)則,AMQP就是這樣的一種協(xié)議,消息發(fā)送與接受的雙方遵守這個協(xié)議可以實現(xiàn)異步通訊。這個協(xié)議約定了消息的格式和工作方式。
RabbitMQ
AMQP 是一種協(xié)議, RabbitMQ是一個由erlang開發(fā)的AMQP的開源實現(xiàn),目前使用比較廣泛的MQ有RabbitMQ,ActiveMQ,KafKa等等,其中ActiveMQ是基于JMS的一個開源實現(xiàn),JMS 是一個接口標(biāo)準(zhǔn)或者說是一個API消息服務(wù)的規(guī)范(JAVA Message Service,java消息服務(wù)),KafKa是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),通常有吞吐量需求的日志處理和日志聚合應(yīng)用會使用Kafka,性能要優(yōu)于Rabbit,但是穩(wěn)定性和可靠性相對而言RabbitMQ要成熟一些。
安裝
下載Erlang:
http://www.erlang.org/downloads
下載rabbitMQ:
http://www.rabbitmq.com/download.html
安裝完成后進(jìn)行配置:
Erlang
首先需要保證ERLANG_HOME環(huán)境配置正確
在環(huán)境變量中添加 ERLANG_HOME的路勁,如D:\Program Files\erl6.3然后在PATH中添加%ERLANG_HOME%\bin 在cmd中輸入erl ,如果能彈出erlang shell界面則表示配置正確了
rabbitMQ
配置RabbitMQ
打開命令行模式cmd:
cd C:\rabbitmq\RabbitMQ\Server\rabbitmq_server-3.0.0\sbin
依次輸入:
1. ./rabbitmq-plugins.bat enable rabbitmq_management
2. ./rabbitmq-service.bat stop
3.rabbitmq-service.bat install 這句話沒用,提示:RabbitMQ service is already present - onlyupdating service parameters
4. ./rabbitmq-service.bat start
重新 start install stop 在執(zhí)行第一個語句就能進(jìn)去網(wǎng)頁。
打開瀏覽器登錄:http://127.0.0.1:15672
55672好像也可以,直接跳轉(zhuǎn)到下列位置
http://127.0.0.1:15672/#/
賬號和密碼都是guest

Admin選顯卡,可以創(chuàng)建一個springcloud賬戶,tags是rabbitmq的角色分類。

快速搭建基本工程
添加依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
</dependencies>
創(chuàng)建自己的springcloud賬戶
在admin選項卡中進(jìn)行創(chuàng)建
點擊創(chuàng)建好的賬戶,設(shè)置virtual hosts ,否則一會鏈接會出錯

創(chuàng)建好的樣子

配置yml文件
端口就是5672,不是15672,這個地方坑了我....
server:
port: 6666
spring:
application:
name: cloud-rabbitmq
rabbitmq:
host: localhost
port: 5672 #
username: springcloud
password: springcloud
配置消息生產(chǎn)者
import java.util.Date;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Sender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
String context = "hello" +new Date();
System.out.println("sender:"+context);
this.rabbitTemplate.convertAndSend("hello",context);
}
}
配置消息消費者
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues="hello")
public class Receiver {
@RabbitHandler
public void process(String hello) {
System.out.println("receiver:"+hello);
}
}
配置基本配置類
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
}
創(chuàng)建測試類
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.example.demo.util.Sender;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqApplicationTests {
@Autowired
private Sender sender;
@Test
public void contextLoads() {
}
@Test
public void hello() throws Exception{
sender.send();
}
}
項目結(jié)構(gòu)圖

啟動項目
看到RabbitMQ Connections和Channels 連接條目

在啟動測試類
控制臺輸出:sender:helloThu Apr 12 15:40:51 CST 2018
切換到主控制臺輸出:
receiver:helloThu Apr 12 15:40:51 CST 2018