说明
生产者配置
Exchange:topic_exchange_shcool
Routing key:topic.shcool.#
消费者代码配置
Exchange:topic_exchange_shcool
Routing key:topic.shcool.user
@PostConstruct
public void twoRabbitInit() {
//声明交换机
twoRabbitAdmin.declareExchange(new TopicExchange("topic_exchange_shcool", true, false));
//声明队列
twoRabbitAdmin.declareQueue(new Queue("topic.shcool.user", true));
//绑定队列及交换机
twoRabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("topic.shcool.user", true, false, false))
.to(new TopicExchange(twoTopicExchange, true, false))
.with("topic.shcool.user"));
}
其实以上代码看着没有问题,意思是代码生成一个队列,并把【topic.shcool.user】队列和生产者的【topic_exchange_shcool】exchange绑定,但是生产者发送消息是通过【topic.shcool.#】通配符去发送的,所以在绑定队列和交换机的时候.with方法要设置好Routing key,并不是你队列的名字,Routing key要和消息生产者的Routing key保持一致,否则消费者即使将队列绑定到exchange也永远无法收到消息,正确代码如下:
@PostConstruct
public void twoRabbitInit() {
//声明交换机
twoRabbitAdmin.declareExchange(new TopicExchange("topic_exchange_shcool", true, false));
//声明队列
twoRabbitAdmin.declareQueue(new Queue("topic.shcool.user", true));
//绑定队列及交换机
twoRabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("topic.shcool.user", true, false, false))
.to(new TopicExchange(twoTopicExchange, true, false))
//不设置通配符 消息不会到队列里来
.with("topic.shcool.#"));
}
这样只要消费者的Exchange为【topic_exchange_shcool】,且队列名为topic.shcool.开头的,都能接收到消息
如果队列还消费不到消息,可能有以下情况:
1、是否与其他队列名起冲突,例如有两个同名队列,消息会被其他队列消费
2、rabbitmq图形界面上Exchange绑定关系是否还存在以前的,需要手动解除绑定
3、队列是否与通配符的Routing key绑定
就先说到这
\color{#008B8B}{ 就先说到这}
就先说到这
在下
A
p
o
l
l
o
\color{#008B8B}{在下Apollo}
在下Apollo
一个爱分享
J
a
v
a
、生活的小人物,
\color{#008B8B}{一个爱分享Java、生活的小人物,}
一个爱分享Java、生活的小人物,
咱们来日方长,有缘江湖再见,告辞!
\color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!}
咱们来日方长,有缘江湖再见,告辞!文章来源:https://www.toymoban.com/news/detail-511269.html
文章来源地址https://www.toymoban.com/news/detail-511269.html
到了这里,关于rabbitmq topic模式设置#通配符情况下 消费者队列未接收消息问题排查解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!