Masstransit+RabbitMQ。在两种不同的消息类型之间共享一个队列

Masstransit+RabbitMQ。在两种不同的消息类型之间共享一个队列,rabbitmq,message-queue,messaging,masstransit,Rabbitmq,Message Queue,Messaging,Masstransit,我有一个发布者,它将消息发布到rabbitmq://localhost/test123 队列一条消息具有TestMessage类型,另一条消息具有TestMessage2类型 发布服务器配置: sbc.UseRabbitMq(r => r.ConfigureHost(new MessageUrn("rabbitmq://localhost/test123"), c => { })); sbc.UseLog4Net(); sbc.UseJsonSerializer(); sbc

我有一个发布者,它将消息发布到rabbitmq://localhost/test123 队列一条消息具有TestMessage类型,另一条消息具有TestMessage2类型

发布服务器配置:

 sbc.UseRabbitMq(r => r.ConfigureHost(new MessageUrn("rabbitmq://localhost/test123"), c => { }));
 sbc.UseLog4Net();
 sbc.UseJsonSerializer();
 sbc.EnableMessageTracing();
 sbc.ReceiveFrom(new MessageUrn("rabbitmq://localhost/test123"));
我有两个seprate消费者,每个消息类型2消费者,消费者1:

  //config stuff
  sbc.ReceiveFrom("rabbitmq://localhost/test678?prefetch=20");
  sbc.Subscribe(subs => { subs.Handler<TestMessage>(msg => { Logger.Info(msg.Text); }); });
消费者2:

 //config stuff
 sbc.ReceiveFrom("rabbitmq://localhost/test678");
            sbc.Subscribe(
                subs =>
                {
                    subs.Handler<TestMessage2>(
                        msg => { Logger.Info(String.Format("rcv:txt= {0}, number= {1}", msg.Text, msg.Number)); });
                });
所以,当我停止发布者并运行其中一个使用者时,他会使用他类型的所有消息,并将其他消息移动到错误队列。Exchange for test678对这两种类型都有绑定

在将其他消息移动到错误队列时,两个不同的使用者会尝试读取他们的消息,这是正常行为吗?为什么我不能在不同兴趣类型的不同消费者之间共享一个队列

我相信这不是masstransit的问题,而是rabbitmq的设计考虑或限制


提前感谢。

如果有多个service bus实例从同一队列接收,则需要确保在该service bus实例上注册的使用者相同。否则,服务使用的消息将被移动到消息类型的错误队列中,而该消息类型在该服务实例上没有使用者。

非常感谢,Chris。还有一个问题:这是因为队列rabbitmq(在本例中)将消息推送到使用者吗?所以,若消费者不知道如何处理此消息类型,他会将其移动到错误队列。我相信,如果有来自消费者端的轮询,这种情况是可以避免的……没有轮询这样的事情,而且这也不重要,因为RMQ不区分消息类型。