RabbitMQ
是一個由erlang開發的AMQP(Advanved Message Queue Protocol)的開源實現。
整合RabbitMq
一、引入依賴以及配置
1、引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、配置yml
spring:
rabbitmq:
host: localhost # 連接地址
username: guest # 賬號
password: guest # 密碼
# port: 5672 # 端口 - 默認5672
# virtual-host: / # 虛擬主機 - 配置文件配置了的 /
二、SpringBoot自動配置做了些什麼
RabbitAutoConfiguration
自動配置了連接工廠ConnectionFactory
,在RabbitProperties
裏封裝了RabbitMQ的配置。爲我們提供了RabbitTemplate
來進行發送和接收消息。
三、接收與發送消息
需要注入RabbitMQTemplate
1、點對點(Direct)
RabbitMQ
發送消息可以通過RabbitTemplate
來做。其中send()
方法,需要三個參數exchange
、routeKey
、message
,其中message需要自己構建並定義消息體內容和消息頭。
而convertAndSend
的第三個參數是Object
,它會把Object
當做消息體,只需要傳入發送的對象,就會自動序列化發送給RabbitMQ。
接收消息可以通過receiveAndConvert
來接收消息並序列化回來。接收消息只需要知道隊列名
即可。
①發送消息
/**
* 單播(點對點)
*/
@Test
public void contextLoads(){
Map map = new HashMap<>();
map.put("msg","這是第一個消息");
map.put("data", Arrays.asList("helloRabbit",123,true));
// 對象需要實現序列化接口
map.put("user",new User("柳成蔭",12));
// 對象被序列化以後發送出去
// 參數分別是:交換器名、路由鍵名、消息
rabbitTemplate.convertAndSend("exchange.direct","lcy.message",map);
}
在RabbitMQ Management
可以看到,經過Java
序列化後的數據,長這個樣子
②接收消息
@Test
public void receive(){
Object o = rabbitTemplate.receiveAndConvert("exchange.direct");
System.out.println("消息類型:" + o.getClass());
System.out.println(o);
}
2、分列模式(fanout)
分列模式發送消息不需要routeKey
,只需要exchange
和object
即可。它會把消息下發到這個exchange
綁定的所有隊列。
/**
* 分列(發佈)
*/
@Test
public void contextLoads(){
Map map = new HashMap<>();
map.put("msg","這是第一個消息");
map.put("data", Arrays.asList("helloRabbit",123,true));
// 對象需要實現序列化接口
map.put("user",new User("柳成蔭",12));
// 對象被序列化以後發送出去
// 參數分別是:交換器名、路由鍵名、消息
rabbitTemplate.convertAndSend("exchange.fanout","",map);
}
接收消息都是一樣的,接收對應隊列
的消息即可。
四、JSON序列化
RabbitMQ
默認的是Java的序列化,我們可以自己配置Jackson2JsonMessageConverter
來進行JSON序列化。
創建一個AMQPConfig
配置類,如下
@Configuration
public class AMQPConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
這樣發送的消息,就會使用JSON序列化放到隊列中去,而接收也可以正常接收到對象。
五、監聽消息
很多場景,我們需要監聽到消息,根據消息內容去做一些業務。在SpringBoot中只需要給啓動類
上面加上@EnableRabbit
註解,並在想要接收消息的方法上面添加@RabbitListener
註解即可。
@Service
public class BlogServiceImpl{
// 指定監聽的隊列
@RabbitListener(queues = "lcy.message")
public void receive(User user){
System.out.println("收到消息:" + user);
}
}
另外一種接收消息的方式
@RabbitListener(queue = "lcy.message")
public void receive(Message message){
// 消息內容
System.out.println(message.getBody);
// 消息頭信息
System.out.println(message.getMessageProperties());
}
六、管理組件的使用
需要注入AmqpAdmin
@Test
public void createExchange(){
// 創建交換器 - Direct類型,名爲amqpadmin.exchange
amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
// 創建隊列 - 指定隊列名和持久化
amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
// 配置綁定規則,綁定交換器和隊列
// 參數:隊列名、隊列類型、交換器、路由名、參數(頭信息)
amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqpadmiin.queue",null));
// 刪除綁定
amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqpadmiin.queue",null));
// 刪除交換器
amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
// 刪除隊列
amqpAdmin.deleteQueue("amqpadmin.queue");
}