0


RabbitMQ(四种使用模式)

文章目录

1.Fanout(广播模式)

1.基本介绍

image-20240511143401624

2.需求分析

image-20240511143533335

3.具体实现
1.编写配置类 RabbitMQConfig.java
// 定义一个交换机,两个队列的名称privatestaticfinalStringEXCHANGE="exchange";privatestaticfinalStringQUEUE1="queue1";privatestaticfinalStringQUEUE2="queue2";// 创建两个队列和一个交换机// 创建队列1@BeanpublicQueuequeue1(){returnnewQueue(QUEUE1,true);}// 创建队列2@BeanpublicQueuequeue2(){returnnewQueue(QUEUE2,true);}// 创建交换机@BeanpublicFanoutExchangeexchange(){returnnewFanoutExchange(EXCHANGE);}// 将队列一和交换机绑定@BeanpublicBindingbinding1(){returnBindingBuilder.bind(queue1()).to(exchange());}// 将队列二和交换机绑定@BeanpublicBindingbinding2(){returnBindingBuilder.bind(queue2()).to(exchange());}
2.编写生产者,发送消息到交换机 MQSender.java
// 发送消息到交换机publicvoidsendExchange(Object message){
        log.info("发送消息到交换机: "+ message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键
        rabbitTemplate.convertAndSend("exchange","", message);}
3.编写消费者,接受消息 MQReceiver.java
// 两个队列从交换机接受消息@RabbitListener(queues ="queue1")publicvoidreceive1(Object message){
        log.info("queue1接收消息: "+ message);}// 两个队列从交换机接受消息@RabbitListener(queues ="queue2")publicvoidreceive2(Object message){
        log.info("queue2接收消息: "+ message);}
4.控制层调用方法,发送信息到交换机
// 发送信息到交换机@RequestMapping("/mq/exchange")@ResponseBodypublicvoidmqExchange(){
        mqSender.sendExchange("hello rabbitmq exchange");}
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/exchange

image-20240511145506791

2.查看控制台输出,两个队列同时接受到了消息

image-20240511145523594

2.访问RabbitMQ控制台 http://ip:15672
1.查看交换机是否绑定了两个队列

image-20240511145927045

image-20240511145938023

2.再查看Queues,新增了两个队列

image-20240511145956152

2.Direct(路由模式)

1.基本介绍

image-20240511150759660

2.需求分析

image-20240511151501711

3.具体实现
1.配置类 RabbitMQConfig.java
// ----------------- Direct模式 -----------------// 定义一个交换机,两个队列的名称privatestaticfinalStringDIRECT_EXCHANGE="directExchange";privatestaticfinalStringDIRECT_QUEUE1="directQueue1";privatestaticfinalStringDIRECT_QUEUE2="directQueue2";// 定义两个路由分别为red和greenpublicstaticfinalStringRED="red";publicstaticfinalStringGREEN="green";// 创建两个队列和一个交换机// 创建队列1@BeanpublicQueuedirectQueue1(){returnnewQueue(DIRECT_QUEUE1,true);}// 创建队列2@BeanpublicQueuedirectQueue2(){returnnewQueue(DIRECT_QUEUE2,true);}// 创建Direct交换机@BeanpublicDirectExchangedirectExchange(){returnnewDirectExchange(DIRECT_EXCHANGE);}// 将队列一和交换机绑定,并指定路由为red@BeanpublicBindingdirectBinding1(){returnBindingBuilder.bind(directQueue1()).to(directExchange()).with(RED);}// 将队列二和交换机绑定,并指定路由为green@BeanpublicBindingdirectBinding2(){returnBindingBuilder.bind(directQueue2()).to(directExchange()).with(GREEN);}// ----------------- Direct模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
// ----------------- Direct模式 -----------------// 发送消息到Direct交换机,指定路由键publicvoidsendDirect(Object message,String routingKey){
        log.info("发送消息到Direct交换机: "+ message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKey
        rabbitTemplate.convertAndSend("directExchange", routingKey, message);}// ----------------- Direct模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
// ----------------- Direct模式 -----------------// directQueue1接收消息@RabbitListener(queues ="directQueue1")publicvoidreceiveDirect(Object message){
        log.info("directQueue1接收消息: "+ message);}// directQueue2接收消息@RabbitListener(queues ="directQueue2")publicvoidreceiveDirect2(Object message){
        log.info("directQueue2接收消息: "+ message);}// ----------------- Direct模式 -----------------
4.控制层调用方法,发送信息到交换机
// ----------------- Direct模式 -----------------// 发送消息到Direct交换机,指定路由键@RequestMapping("/mq/direct/{routingKey}")@ResponseBodypublicvoidmqDirect(@PathVariableString routingKey){
        mqSender.sendDirect("hello rabbitmq direct", routingKey);}// ----------------- Direct模式 -----------------
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/direct/green

image-20240511155350571

2.访问 http://localhost:9092/seckill/mq/direct/red

image-20240511155417490

2.访问RabbitMQ控制台 http://140.143.164.206:15672
1.交换机绑定了两个队列

image-20240511155827225

image-20240511155911603

2.再查看Queues,新增了两个队列

image-20240511155943495

3.Topic(主题模式)

1.基本介绍
1.介绍

image-20240511161221729

2.关于匹配模式的说明
  • 星号:可以匹配一个单词
  • 井号:可以匹配零个或多个单词
2.需求分析

image-20240511161528268

3.具体实现
1.配置类 RabbitMQConfig.java
// ----------------- Topic模式 -----------------// 定义一个交换机,两个队列的名称privatestaticfinalStringTOPIC_EXCHANGE="topicExchange";privatestaticfinalStringTOPIC_QUEUE1="topicQueue1";privatestaticfinalStringTOPIC_QUEUE2="topicQueue2";// 定义三个路由publicstaticfinalStringROUTING_KEY1="*.orange.*";publicstaticfinalStringROUTING_KEY2="*.*.rabbit";publicstaticfinalStringROUTING_KEY3="lazy.#";// 创建两个队列和一个交换机// 创建队列1@BeanpublicQueuetopicQueue1(){returnnewQueue(TOPIC_QUEUE1,true);}// 创建队列2@BeanpublicQueuetopicQueue2(){returnnewQueue(TOPIC_QUEUE2,true);}// 创建Topic交换机@BeanpublicTopicExchangetopicExchange(){returnnewTopicExchange(TOPIC_EXCHANGE);}// 将队列一和交换机绑定,并指定路由为*.orange.*@BeanpublicBindingtopicBinding1(){returnBindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1);}// 将队列二和交换机绑定,并指定路由为*.*.rabbit和lazy.#@BeanpublicBindingtopicBinding2(){returnBindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY2);}@BeanpublicBindingtopicBinding3(){returnBindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY3);}// ----------------- Topic模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
// ----------------- Topic模式 -----------------// 发送消息到Topic交换机,指定路由键publicvoidsendTopic(Object message,String routingKey){
        log.info("发送消息到Topic交换机: "+ message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKey
        rabbitTemplate.convertAndSend("topicExchange", routingKey, message);}// ----------------- Topic模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
// ----------------- Topic模式 -----------------// topicQueue1接收消息@RabbitListener(queues ="topicQueue1")publicvoidreceiveTopic1(Object message){
        log.info("topicQueue1接收消息: "+ message);}// topicQueue2接收消息@RabbitListener(queues ="topicQueue2")publicvoidreceiveTopic2(Object message){
        log.info("topicQueue2接收消息: "+ message);}// ----------------- Topic模式 -----------------
4.控制层调用方法,发送信息到交换机
// ----------------- Topic模式 -----------------// 发送消息到Topic交换机,指定路由键@RequestMapping("/mq/topic/{routingKey}")@ResponseBodypublicvoidmqTopic(@PathVariableString routingKey){
        mqSender.sendTopic("hello rabbitmq topic", routingKey);}// ----------------- Topic模式 -----------------
4.启动测试
1.示意图

image-20240511161528268

2.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1

image-20240511163348473

2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2

image-20240511163438210

3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2

image-20240511163527113

4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2

image-20240511163618877

4.Headers(头路由模式,使用较少)

1.基本介绍

image-20240511164450490

2.示意图

image-20240511165737435

3.需求分析

image-20240511170148293

4.具体实现
1.配置类 RabbitMQConfig.java
// ----------------- Headers模式 -----------------// 定义一个交换机,两个队列的名称privatestaticfinalStringHEADERS_EXCHANGE="headersExchange";privatestaticfinalStringHEADERS_QUEUE1="headersQueue1";privatestaticfinalStringHEADERS_QUEUE2="headersQueue2";// 创建两个队列和一个交换机// 创建队列1@BeanpublicQueueheadersQueue1(){returnnewQueue(HEADERS_QUEUE1,true);}// 创建队列2@BeanpublicQueueheadersQueue2(){returnnewQueue(HEADERS_QUEUE2,true);}// 创建Headers交换机@BeanpublicHeadersExchangeheadersExchange(){returnnewHeadersExchange(HEADERS_EXCHANGE);}// 将队列一和交换机绑定,并指定key-value,使用any表示只要有一个匹配就可以@BeanpublicBindingheadersBinding1(){Map<String,Object> map =newHashMap<>();
        map.put("key1","value1");
        map.put("key2","value2");returnBindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAny(map).match();}// 将队列二和交换机绑定,并指定key-value,使用all表示所有的key-value都要匹配@BeanpublicBindingheadersBinding2(){Map<String,Object> map =newHashMap<>();
        map.put("key3","value3");
        map.put("key4","value4");returnBindingBuilder.bind(headersQueue2()).to(headersExchange()).whereAll(map).match();}// ----------------- Headers模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
// ----------------- Headers模式 -----------------// 发送消息到Headers交换机,匹配队列一publicvoidsendHeaders(Object message){
        log.info("发送消息到Headers交换机: "+ message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键
        rabbitTemplate.convertAndSend("headersExchange","", message, message1 ->{
            message1.getMessageProperties().getHeaders().put("key1","value1");return message1;});}// 发送消息到Headers交换机,匹配队列二publicvoidsendHeaders2(Object message){
        log.info("发送消息到Headers交换机: "+ message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键
        rabbitTemplate.convertAndSend("headersExchange","", message, message1 ->{
            message1.getMessageProperties().getHeaders().put("key3","value3");
            message1.getMessageProperties().getHeaders().put("key4","value4");return message1;});}// ----------------- Headers模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
// ----------------- Headers模式 -----------------// headersQueue1接收消息@RabbitListener(queues ="headersQueue1")publicvoidreceiveHeaders1(Object message){
        log.info("headersQueue1接收消息: "+ message);}// headersQueue2接收消息@RabbitListener(queues ="headersQueue2")publicvoidreceiveHeaders2(Object message){
        log.info("headersQueue2接收消息: "+ message);}// ----------------- Headers模式 -----------------
4.控制层调用方法,发送信息到交换机
// ----------------- Headers模式 -----------------// 发送消息到Headers交换机,匹配队列一@RequestMapping("/mq/headers")@ResponseBodypublicvoidmqHeaders(){
        mqSender.sendHeaders("hello rabbitmq headers");}// 发送消息到Headers交换机,匹配队列二@RequestMapping("/mq/headers2")@ResponseBodypublicvoidmqHeaders2(){
        mqSender.sendHeaders2("hello rabbitmq headers2");}// ----------------- Headers模式 -----------------
5.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一

image-20240511173539342

2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二

image-20240511173600832

5.RabbitMQ使用模式总结

1.整体架构图

image-20240511173928100

2.通用使用方式
1.编写RabbitMQ的配置类
  • 创建交换机和队列
  • 将队列分别与交换机按照具体标识绑定
2.编写消息发送者
  • 指定交换机
  • 携带消息和具体队列标识
3.编写消息接受者
  • 只需要监听队列,接收消息即可
4.编写控制层
  • 调用消息发送者,向交换机发送请求
标签: rabbitmq 分布式

本文转载自: https://blog.csdn.net/m0_64637029/article/details/138819796
版权归原作者 S-X-S 所有, 如有侵权,请联系我们删除。

“RabbitMQ(四种使用模式)”的评论:

还没有评论