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

参考文章:

https://www.cnblogs.com/hlhdidi/p/6535677.html

 

 

 

 

  • 15
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值