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("atguigu.news");
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");
}