今天继续介绍一种rabbitmq的模式-topic模式
创建queue和exchange
@Configuration
public class TopicRabbitConfig {
@Bean
public Queue topicA(){
return new Queue("topicA");
}
@Bean
public Queue topicB(){
return new Queue("topicB");
}
@Bean
public TopicExchange topicExchange(){
return new TopicExchange("topicExchange");
}
@Bean
Binding BindTopicA(Queue topicA, TopicExchange topicExchange){
return BindingBuilder.bind(topicA).to(topicExchange).with("topic.message");
}
//*表示一个词,#表示零个或多个词
/**
*
* @param topicB
* @param topicExchange
* *表示一个词,#表示零个或多个词
* @return
*/
@Bean
Binding BindTopicB (Queue topicB, TopicExchange topicExchange){
return BindingBuilder.bind(topicB).to(topicExchange).with("topic.#");
}
}
需要注意的是:topic中的routingKey支持模糊匹配, topic.message表示只能监听到routingKey为topic.messaged的消息
topic.*和topic.#区别是:topic.*表示只能监听到topic.xxx的消息,而不能监听到topic.xxx.xxx的消息
发送端:
@Component
public class TopicSend {
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(){
String context = "测试Topic";
System.out.println("send"+context);
this.rabbitTemplate.convertAndSend("topicExchange","topic",context);
}
}
两个消费端:
@Component
@RabbitListener(queues = "topicA")
public class TopicReceiveA {
@RabbitHandler
public void receive(String content){
System.out.println("TopicA"+content);
}
}
@Component
@RabbitListener(queues = "topicB")
public class TopicReceiveB {
@RabbitHandler
public void receive(String content){
System.out.println("TopicB"+content);
}
}
控制台打印:因为我们routingKey是topic,所以只能B对列消费到消息

我们吧routingKey改为topic.message,会发现A和B两个消费端都可以接受到消息
本文深入探讨了RabbitMQ的Topic模式,介绍了如何通过配置实现消息的模糊匹配,包括topic.*与topic.#的区别,以及如何设置发送端和接收端来确保消息正确地被路由到指定的队列。
473

被折叠的 条评论
为什么被折叠?



