2017-07-07 158 views
0

我有一个发布者,它将消息发布到rabbitmq:// localhost/test123队列。一条消息具有TestMessage类型,另一条是TestMessage2类型。Masstransit + RabbitMQ。在两种不同的消息类型之间共享一个队列

出版商配置:

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名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对这两种类型都有绑定。

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

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

在此先感谢。

回答

1

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

+0

非常感谢Chris。还有一个问题:是否因为队列(在这种情况下为rabbitmq)将消息推送给消费者?所以如果消费者不知道如何处理这种消息类型,他会将其移动到错误队列中。我相信,如果从消费者方面进行轮询,可以避免这种情况... – Sharov

+1

轮询并不存在,因为RMQ不会歧视消息类型。 –

相关问题