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