RabbitMQ中的交换类型问题。消费者期望“扇出”,但生产者实际情况是“主题”

时间:2019-02-04 10:28:25

标签: rabbitmq

我有一个docker环境,其中在docker中配置了消息传递服务(rabbitmq)和我的服务(myapp)。我尝试使用myapp发布的消息。 myapp在给定的消息通道和使用者代码中生成“扇出”类型的消息,我尝试设置rabbitmq复杂性,以便可以使用“扇出”类型的消息。

consumer sample:
factry = newConnectionFactory();
factry.setHost(MYHOST);
connection.newConnection();
chnl = connection.createChannel();
channel.exchangeDeclare("MYEXCHG","fanout",true);
.....
and so  on. 

当消费者如上所示设置Rabbitmq时: 我收到以下PRECONDITION错误: 造成原因:

  

com.rabbitmq.client.ShutdownSignalException:通道错误;协议   方法:#method(reply-code = 406,   Reply-text = PRECONDITION_FAILED-用于交换的等价arg'type'   虚拟主机“ /”中的“ applicationStatus”:收到“扇出”,但当前为   'topic',class-id = 40,method-id = 10)

我已经分析了生产者代码和消费者代码。我仍然无法缩小问题的范围。我在这里的问题是:我可以以一种能够接收生产者发送的任何类型消息的方式配置通道吗?

说生产者P1产生直接类型的消息,P2产生扇出类型的消息。我可以使用通用的消费者代码,以便它能够接收从P1和P2产生的消息吗?

2 个答案:

答案 0 :(得分:0)

  

说生产者P1产生直接类型的消息,P2产生扇出类型的消息。我可以使用通用的消费者代码,以便它能够接收从P1和P2产生的消息吗?

消息没有directfanout类型,而交换却有。您的发布者和消费者代码将必须声明两个交换,每种类型之一。

然后,您的发布者将发布到每个交易所,具体取决于消息是应直接路由到一个队列还是扇出到多个队列。

最后,您的使用者必须声明队列并将其绑定到每个交换,然后从每个队列中进行使用。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。

答案 1 :(得分:0)

是,不是消息类型,而是交换类型。感谢Luke Bakken的输入。我已经联系了rabbitmq论坛。

https://groups.google.com/forum/#!topic/rabbitmq-users/6IQ4s6pmys0