个人笔记之rabbitTemplate及amqpTemplate发布模式
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