(四)RabbitMQ工作模式之主题模式(Topic | Routing )图文教学通俗易懂,SpringBoot集成,超级简单!!

教程相关代码:RabbitMQ入门教程——GitHub

1.主题模式(Topic | Routing )

如果需要将消息发送到指定的队列(交换机上绑定了许多队列),那么你就需要使用该模式。该模式其实是分裂模式的加强版,分裂模式就像各个家的门没有上锁,主题模式就是把门上了锁,需要相应的钥匙才能打开。
在这里插入图片描述

  • 在该模式下,每个绑定在交换机上的队列都有自己的bindingkey,这个就是队列的锁
  • 在该模式下,消息都带有自己的routingkey,这个就是消息的钥匙
  • 一个routingkey可以打开多个bindingkey
  • 模糊匹配,在bindingkey中,符号 # 匹配一个或多个词,符号 * 匹配不多不少一个词。因此,如果routingkey为queue1.abc会匹配到队列1,如果routingkey为queue1.queue2.a会匹配到队列1和队列2
  • 精确匹配,如果你在bindingkey中不使用#*符号,那么就必须bindingkey=routingkey才能匹配上

2.实现

2.1 完成MQ页面部署
2.1.1创建队列

这里使用的还是上章(分裂模式)中的队列
在这里插入图片描述

2.1.2 创建交换机

在MQ管理页面中进入Exchanges,按照图片中步骤
在这里插入图片描述
:交换机类型不要弄错了!!

2.1.3 交换机绑定队列(设置bindingkey)

点击进入刚刚创建的交换机
在这里插入图片描述
绑定刚刚创建的两个队列,成功后如下图:
在这里插入图片描述
注: 此时的key值

2.2 代码编写
2.2.1 环境编写

第一章中我们已经创建了父工程,这次我们直接在其下创建子模块topic
在这里插入图片描述
创建SpringBoot的启动类,com.lois.topic.TopicApplication.class

@SpringBootApplication
public class TopicApplication {
    public static void main(String[] args) {
        SpringApplication.run(TopicApplication.class,args);
    }
}
2.2.2 目录结构

这个贴出来只是为了让读者有一个总体概念,不需要创建,在后面会一步步创建
在这里插入图片描述

2.2.3 生产者
2.2.3.1编写生产者

在Test包中创建生产者测试类,com.lois.test.ProducerTest.class

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TopicApplication.class)
public class ProducerTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSend1(){
        rabbitTemplate.convertAndSend("exchange2","queue1.abc","主题模式测试,routingkey=queue1.abc");
    }

    @Test
    public void testSend2(){
        rabbitTemplate.convertAndSend("exchange2","queue1.queue2.abc","主题模式测试,routingkey=queue1.queue2.abc");
    }
}

注: convertAndSend(交换机名,routingkey,消息) routingkey需要能够匹配在交换机中的bindingkey。

2.2.3.2 测试生产者

运行测试方法testSend1(),打开RabbitMQ管理界面,可以看到如图信息:
在这里插入图片描述
此时,生产者产生的消息传输到queue1中,因为routingkey匹配queue1。

然后,运行测试方法testSend2(),打开RabbitMQ管理界面,可以看到如图信息:
在这里插入图片描述
此时,生产者产生的消息传输到queue1和queue2中,因为routingkey匹配queue1和queue2。

2.2.4 消费者
2.2.4.1编写消费者

在java包中创建两个消费者类,com.lois.topic.customer.Customer1

@Component
@RabbitListener(queues = "queue1")
public class Customer1 {
    @RabbitHandler
    public void showMessage(String message){
        System.out.println("Customer1111接受到的信息:"+message);
    }
}

com.lois.topic.customer.Customer2

@Component
@RabbitListener(queues = "queue2")
public class Customer2 {
    @RabbitHandler
    public void showMessage(String message){
        System.out.println("Customer2222接受到的信息:"+message);
    }
}

@RabbitListener(queues = “监听队列的名称”)
两个消费者各自监听一个队列

2.2.4.2 测试消费者

运行FanoutApplication.class,在控制台就能看见输出:
在这里插入图片描述
此时,MQ管理页面也能看见消息数量变为0

上一章节:RabbitMQ工作模式之分裂模式

相关链接:
RabbitMQ工作模式之直接模式
RabbitMQ工作模式之分裂模式
RabbitMQ工作模式之主题模式

作者编写不易,转载请注明我的博客,如果觉得写的不错的话,请随手点个赞,谢谢!!!
作者编写不易,转载请注明我的博客,如果觉得写的不错的话,请随手点个赞,谢谢!!!
作者编写不易,转载请注明我的博客,如果觉得写的不错的话,请随手点个赞,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值