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

时间:2017-07-07 18:42:58

标签: 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.EnableMessageTracing();
 sbc.ReceiveFrom(new MessageUrn("rabbitmq://localhost/test123"));

每个消息类型(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具有两种类型的绑定。

2个不同的消费者在将其他消息移至错误队列时是否会尝试读取其消息是否是正常行为?为什么我不能在不同感兴趣类型的不同消费者之间共享一个队列?

(我认为这不是masstransit问题,而是rabbitmq设计考虑或限制)

提前致谢。

1 个答案:

答案 0 :(得分:1)

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