• RabbitMQ:发布订阅和路由模式


    发布订阅模式

    前面我们已经了解了RabbitMQ客户端的一些基本操作,包括普通的消息模式,接着我们来了解一下其他的模式,首先是发布订阅模式,它支持多种方式:

    比如我们在阿里云买了云服务器,但是最近快到期了,那么就会给你的手机、邮箱发送消息,告诉你需要去续费了,但是手机短信和邮件发送并不一定是同一个业务提供的,但是现在我们又希望能够都去执行,所以就可以用到发布订阅模式,简而言之就是,发布一次,消费多个。

    实现这种模式其实也非常简单,但是如果使用我们之前的直连交换机,肯定是不行的,我们这里需要用到另一种类型的交换机,叫做fanout(扇出)类型,这时一种广播类型,消息会被广播到所有与此交换机绑定的消息队列中。

    这里我们使用默认的交换机:

    这个交换机是一个fanout类型的交换机,我们就是要它就行了:

    1. @Configuration
    2. public class RabbitConfiguration {
    3. @Bean("fanoutExchange")
    4. public Exchange exchange(){
    5. //注意这里是fanoutExchange
    6. return ExchangeBuilder.fanoutExchange("amq.fanout").build();
    7. }
    8. @Bean("yydsQueue1")
    9. public Queue queue(){
    10. return QueueBuilder.nonDurable("yyds1").build();
    11. }
    12. @Bean("binding")
    13. public Binding binding(@Qualifier("fanoutExchange") Exchange exchange,
    14. @Qualifier("yydsQueue1") Queue queue){
    15. return BindingBuilder
    16. .bind(queue)
    17. .to(exchange)
    18. .with("yyds1")
    19. .noargs();
    20. }
    21. @Bean("yydsQueue2")
    22. public Queue queue2(){
    23. return QueueBuilder.nonDurable("yyds2").build();
    24. }
    25. @Bean("binding2")
    26. public Binding binding2(@Qualifier("fanoutExchange") Exchange exchange,
    27. @Qualifier("yydsQueue2") Queue queue){
    28. return BindingBuilder
    29. .bind(queue)
    30. .to(exchange)
    31. .with("yyds2")
    32. .noargs();
    33. }
    34. }

    这里我们将两个队列都绑定到此交换机上,我们先启动看看效果:

    绑定没有什么问题,接着我们搞两个监听器,监听一下这两个队列:

    1. @Component
    2. public class TestListener {
    3. @RabbitListener(queues = "yyds1")
    4. public void receiver(String data){
    5. System.out.println("一号消息队列监听器 "+data);
    6. }
    7. @RabbitListener(queues = "yyds2")
    8. public void receiver2(String data){
    9. System.out.println("二号消息队列监听器 "+data);
    10. }
    11. }

    现在我们通过交换机发送消息,看看是不是两个监听器都会接收到消息:

    可以看到确实是两个消息队列都能够接受到此消息:

    这样我们就实现了发布订阅模式。

    路由模式

    路由模式实际上我们一开始就已经实现了,我们可以在绑定时指定想要的routingKey只有生产者发送时指定了对应的routingKey才能到达对应的队列。

    当然除了我们之前的一次绑定之外,同一个消息队列可以多次绑定到交换机,并且使用不同的routingKey,这样只要满足其中一个都可以被发送到此消息队列中:

    1. @Configuration
    2. public class RabbitConfiguration {
    3. @Bean("directExchange")
    4. public Exchange exchange(){
    5. return ExchangeBuilder.directExchange("amq.direct").build();
    6. }
    7. @Bean("yydsQueue")
    8. public Queue queue(){
    9. return QueueBuilder.nonDurable("yyds").build();
    10. }
    11. @Bean("binding") //使用yyds1绑定
    12. public Binding binding(@Qualifier("directExchange") Exchange exchange,
    13. @Qualifier("yydsQueue") Queue queue){
    14. return BindingBuilder
    15. .bind(queue)
    16. .to(exchange)
    17. .with("yyds1")
    18. .noargs();
    19. }
    20. @Bean("binding2") //使用yyds2绑定
    21. public Binding binding2(@Qualifier("directExchange") Exchange exchange,
    22. @Qualifier("yydsQueue") Queue queue){
    23. return BindingBuilder
    24. .bind(queue)
    25. .to(exchange)
    26. .with("yyds2")
    27. .noargs();
    28. }
    29. }

    启动后我们可以看到管理面板中出现了两个绑定关系:

    这里可以测试一下,随便使用哪个routingKey都可以。

  • 相关阅读:
    我的世界Minecraft Java开服教程(Windows)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器资源包
    八大排序算法和时间复杂度
    笔记本电脑 禁用/启用 自带键盘
    NTT 的各类优化
    springboot新冠疫苗预约系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
    电商API:淘宝京东拼多多1688多电商平台的商品销量库存信息获取
    纯前端js中使用sheetjs导出excel,并且合并标题
    力扣每日一题-第27天-561.数组拆分Ⅰ
    动态路由协议OSPF项目部署(二)
    一个用于读取文件内容的 JavaScript 函数
  • 原文地址:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126188929