个人笔记之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

经验分享 程序员 微信小程序 职场和发展