我们通过fanout exchange(扇型交换机)实现生产者发送一个消息,这个消息同时被传送给所有队列。但是有时我们不希望所有的消息都被所有队列接收,我们希望可以指定类型为a的消息只能被队列A接收,类型为b的消息只能被队列B,C接收。扇型交换机只能无脑地广播消息给所有的消费者,其实质是广播给所有关联的队列

为了实现这个功能,一种是建立多个交换机,这种方式简单暴力但是不灵活。本节我们介绍使用单个直连交换机+路由实现以上功能

1. 单个绑定

在上图中,有2个队列绑定到直连交换机上。队列Q1使用绑定值为orange,队列Q2绑定值为black,green。在这种情况下,如果生产者发送的消息的路由值为orange,则此消息会被路由到队列Q1。如果生产者发送的消息的路由值为blcak,green,则此消息会被路由到队列Q2。其它的消息会被丢弃

2. 多个绑定

我们也可以将相同的绑定值绑定到不同的队列中。如上图中,队列Q1和Q2使用的绑定值都black。如果生产者发送的消息的路由值为black,则此消息会被同时路由到队列Q1和队列Q2

3. 完整代码示例
  • 新增DirectExchangeConfig.java
@Configuration
public class DirectExchangeConfig {@Beanpublic DirectExchange direct() {return new DirectExchange("direct");}private static class ConsumerConfig {@Beanpublic Queue directAutoDeleteQueue1() {return new AnonymousQueue();}@Beanpublic Queue directAutoDeleteQueue2() {return new AnonymousQueue();}@Beanpublic Binding directBinding1(DirectExchange direct, Queue directAutoDeleteQueue1) {return BindingBuilder.bind(directAutoDeleteQueue1).to(direct).with("orange");}@Beanpublic Binding directBinding2(DirectExchange direct, Queue directAutoDeleteQueue2) {return BindingBuilder.bind(directAutoDeleteQueue2).to(direct).with("black");}@Beanpublic Binding directBinding3(DirectExchange direct, Queue directAutoDeleteQueue2) {return BindingBuilder.bind(directAutoDeleteQueue2).to(direct).with("green");}}
}
  • 生产者
@Component
public class DirectSender {private RabbitTemplate rabbitTemplate;public DirectSender(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void send() {rabbitTemplate.convertAndSend("direct", "orange", "orange msg");rabbitTemplate.convertAndSend("direct", "green", "green msg");rabbitTemplate.convertAndSend("direct", "black", "black msg");}
}
  • 消费者
@Component
public class DirectReceiver {@RabbitListener(queues = "#{directAutoDeleteQueue1.name}")public void receive1(String in) {System.out.println("临时队列1接收到消息:" + in);}@RabbitListener(queues = "#{directAutoDeleteQueue2.name}")public void receive2(String in) {System.out.println("临时队列2接收到消息:" + in);}
}
  • 验证
@SpringBootTest
public class RabbitTest {@Autowiredprivate DirectSender directSender;@Testpublic void testDirectSender() {directSender.send();}
}

可以看到绑定路由键black与green的队列2接收到消息
欢迎关注公众号算法小生或沈健的技术博客shenjian.online

6.RabbitMQ系列之direct直连交换器相关推荐

  1. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  2. RabbitMQ(四):Exchange交换器--direct

    内容翻译自:RabbitMQ Tutorials Java版 RabbitMQ(一):Hello World程序 RabbitMQ(二):Work Queues.循环分发.消息确认.持久化.公平分发 ...

  3. RabbitMQ系列笔记广播模式和路由模式

    导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...

  4. RabbitMQ系列笔记介绍篇

    导语 rabbitMQ是市面上应用很广的一种应用间传送数据的通信方式,是由erlang语言开发,主要特点就是异步通信,实现服务与服务之间的解耦. 特点 可靠性:提供了持久化.传输时确认.发布时确认.跟 ...

  5. Rabbitmq 系列

    Rabbitmq介绍 Rabbitmq是一个开源的AMQP实现,服务端用Erlang语言编写,支持多种客户端,用于在分布式系统中存储转发消息,在易用性,扩展性,高可用性 等方面表现不俗 Rabbitm ...

  6. RabbitMQ(五):Exchange交换器--topic

    内容翻译自:RabbitMQ Tutorials Java版 RabbitMQ(一):Hello World程序 RabbitMQ(二):Work Queues.循环分发.消息确认.持久化.公平分发 ...

  7. RabbitMQ(三):Exchange交换器--fanout

    内容翻译自:RabbitMQ Tutorials Java版 RabbitMQ(一):Hello World程序 RabbitMQ(二):Work Queues.循环分发.消息确认.持久化.公平分发 ...

  8. RabbitMQ系列教程之四:路由(Routing)

    在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例如,我们可以只将关键的 ...

  9. RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)

    在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个[消费者]传递信息.这种模式被称为"发布/订阅 ...

最新文章

  1. IBatis Map时间参数文字格式不匹配!
  2. 中国的人生路上是紧跟领导就会有回报
  3. 如何导入别人的android studio项目,解决gradle版本不兼容问题
  4. SSL certificate problem, verify that the CA cert is OK. Details:
  5. java 当前时间格式_java 处理时间的各种方式——获取时间——时间格式化
  6. mysql load data 乱码的问题
  7. 嘉楠发布阿瓦隆浸入式冷却矿机A1066I
  8. [转]asp.net 动态添加多附件上传
  9. 更加全面的ASP.NET AJAX(Atlas)学习、参考资源(英文)
  10. python数字猜大小游戏
  11. 天津互联网公司和生活成本
  12. yourshelf是什么意思中文_[英语shelf的中文是什么意思]英语shelf的中文是什么意思...
  13. Outlook关闭时最小化到任务栏的完美解决方法
  14. 关于mirro多仓库配置的一些问题
  15. JVM 报 GC Overhead limit exceeded 是什么意思?
  16. 各个流行语言优缺点对比及其适用场景
  17. DCT离散余弦变换(C语言)
  18. 979_MISRA C规范学习笔记3
  19. 2022-2028全球与中国平板显示器制造设备市场现状及未来发展趋势
  20. 手动去除有道词典7.0Beta版底部广告栏

热门文章

  1. github可以刷星吗_GitHub 有偿刷星,上千 Star 数背后的猫腻
  2. 微信小程序开发动态设置tabbar
  3. 后台管理界面-- 管理员管理[4]
  4. u-boot最新版本烧录出现无法烧录失败的原因
  5. Kafka详解(五)Kafka副本机制
  6. NOIP2016 总结
  7. rpf逆向路径转发 linux,CISCO 组播RPF 逆向路径转发 实验原理
  8. 麻城一中2021高考成绩查询,麻城一中隆重举行2021届高考百日誓师大会
  9. 佳能fax_l150如何打印_佳能l150说明书
  10. 检测、获取控制硬件摄像头,扬声器,麦克风的C#小实例