RabbitMQ玩Topic主题模式

这个功能需求一直都在,最近也是忙着写业务代码没来得及做实验demo的小总结,这个功能在以前用过的功能中就是关注频道的推送。国庆节终于有空了,就着自己机器的小例子来记录一下~
基本的搭建和基本概念不再说,可以看:

RabbitMQ在SpringBoot中的简单使用
RabbitMQ的几个重要基础概念!没看之前不要说搭MQ用MQ!

直接开始:

(1)Controller中:

@Autowired
    private RabbitMqService rabbitMqService;

@GetMapping("/rabbitMq1")
    public void rabbitMq1(){
    
    
        String s = rabbitMqService.sendTopicData1();
        System.out.println("学习频道发送:"+s);
    }
    @GetMapping("/rabbitMq2")
    public void rabbitMq2(){
    
    
        String s = rabbitMqService.sendTopicData2();
        System.out.println("测验频道发送:"+s);
    }

(2)rabbitMqService中:

@Service
public class RabbitMqService {
    
    
    @Autowired
    RabbitTemplate rabbitTemplate;

    public String sendTopicData1() {
    
    
        String randomNumber = new String(UUID.randomUUID().toString()+":学习数学频道");
        rabbitTemplate.convertAndSend("learn_math","learn.math",randomNumber);
        return randomNumber;
    }

    public String sendTopicData2() {
    
    
        String randomNumber = new String(UUID.randomUUID().toString()+":数学测验频道");
        rabbitTemplate.convertAndSend("test_math","test.math",randomNumber);
        return randomNumber;
    }
}

(3)MQ消费端采用监听器方式(自动应答模式):

 @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "jojo_subject"),key = "learn.math",
            exchange = @Exchange(value = "learn_math",type = "topic")))
    @RabbitHandler
    public void topicHandle(@Payload String msg, @Headers Map<String,Object> headers) throws IOException {
    
    
        Long tag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
        try {
    
    
            System.out.println("学习频道获取信息:"+msg);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            System.out.println(e);
        }
    }

    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "jojo_subject2"), key = "test.math",
            exchange = @Exchange(value = "test_math",type = "topic")))
    @RabbitHandler
    public void topicMsg(String a){
    
    
        System.out.println("数学测验频道收到:"+a);
    }

(4)MQ的控制台中配置:

在这里插入图片描述

learn_math:

在这里插入图片描述

test_math:

在这里插入图片描述

(4)测试:

按道理说,我这里让测试数学的频道关注了所有math结尾的路由key,但是学习数学频道只关注绑定了学习的路由key。那么正常理想的状态就是:数学测试频道发送的消息,学习队列和测试队列都能收到。但是学习频道发的消息,仅仅是学习频道获取得到~
开始!

在这里插入图片描述
在这里插入图片描述

正确!再试试!

在这里插入图片描述
在这里插入图片描述

正确!打完收工!

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/108910002