2017-07-07 92 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不會歧視消息類型。 –

相關問題