这个功能需求一直都在,最近也是忙着写业务代码没来得及做实验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。那么正常理想的状态就是:数学测试频道发送的消息,学习队列和测试队列都能收到。但是学习频道发的消息,仅仅是学习频道获取得到~
开始!
正确!再试试!