rabbitTemplate及amqpTemplate发布模式
- 不足之处欢迎留言
1、rabbitTemplate和amqpTemplate有什么关系?
- 源码中会发现rabbitTemplate实现自amqpTemplate接口,使用起来并无区别,需引入spring-boot-starter-amqp依赖。
2、组成
- 生产者
- 消息队列
- 消费者
- 交换机:
- 隔离生产者和消息队列,充当二者中间体。
- 接受相应的消息并绑定到指定队列
3、三种发布模式
- 根据交换机类型不同,分为3种:
- Direct<直接>:1对1-----一个消息只能被一个消费者消费
- Topic<主题>:1对多-----一个消息可以被多个消费者消费(纠正:一个消息可被多个队列接收,若多个消费者监听同一个队列,会以轮询方式被多个消费者接收,本质依然是1对1,类Direct。详述见下方评论!)
- Fanout<分列>:广播
4、Direct发布模式
-
核心依赖及application.properties(除端口外不变)
-
生产者工程
- 4.1、创建消息队列
两种方式:
(1)@Configuration和@Bean配置队列conf,指定
(2)RabbitMQ管理界面手动添加队列
- 4.2、发送端
API:amqpTemplate.convertAndSend("队列名",“消息内容”)
此处队列名必须与创建的队列一致。
- 4.3、测试类
-
消费者工程
- 4.1、创建消息队列
同上:略
- 4.2、接收端
@RabbitListener(queues = "direct"):监听器监听指定队列
- 4.2、启动服务并测试结果
启动消费工程
启动生产工程
启动生产工程中的测试类
结果:消费者打印输出消息内容
5、Topic发布模式
-
生产者工程
- 5.1、创建消息队列
API:BindingBuilder.bind(指定队列).to(交换机).with(路由键);
路由键相当于队列名
- 5.2、发送端:
API:amqpTemplate.convertAndSend("交换机名",“路由键”,“消息内容”)
RabbitMQ将会根据第二个参数去寻找有没有匹配此规则的队列,如果有,则把消息给它,如果有不止一个,则把消息分发给匹配的队列(每个队列都有消息!)
- 5.3、测试类
-
消费者工程
- 5.1、创建消息队列
同上:略
- 5.2、接收端
- 5.3、启动服务并测试结果
同上:略
注意:topic模式中只有消费端监听的路由键符合发送端的路由规则(路由键决定)的队列才会收到消息。
6、Fanout发布模式
- 广播:发送到路由器的消息会使得绑定到该路由器的每一个Queue接收到消息,这个时候就算指定了Key,或者规则(即上文中convertAndSend方法的参数2),也会被忽略!
- 交换机类型:FanoutExchange
- API:amqpTemplate.convertAndSend("交换机名",“ ”,“消息内容”);//路由键被忽略
- 消费端:只要是绑定到该交换机上的都能收到消息。
7、总结
- SpringBoot很强大,省了很多繁琐的配置,极大的提升了开发效率。
- 注意Topic模式,并非一个消息可以被多个消费者消费!
- 遇到的异常
测试类启动报空指针异常。
- 解决
@Test注解需要结合@RunWith@SpringBootTest
参考文章: