2017-02-27 53 views
0

我有2個服務設置爲接收相同的郵件,例如, ConsumerA : IConsumer<IMessageA>ConsumerB : IConsumer<IMessageA>。每項服務設置一個獨特的端點,例如queue_aqueue_b並註冊其用戶。我在RabbitMQ中看到了一種類型爲扇出的IMessageA交換,並且綁定到queue_aqueue_b。到現在爲止還挺好。MassTransit:多個使用者,單獨的隊列/端點,郵件未遞送

  • 我運行這兩個服務併發布消息,但只有服務A得到它。
  • 我停止服務A並手動向RabbitMQ中的B發佈消息(服務A是發佈IMessageA以響應POST的使用IRequestClient<IMessageA, IMessageAResponse>的Web服務,這是我爲什麼需要手動發佈的消息),現在服務B獲取消息並按預期消耗它。

需要明確的是,與服務停止的,該消息由RabbitMQ的路由至queue_aqueue_b。如果服務A正在運行,則消息只有纔會轉到queue_b,儘管存在交換綁定,表明queue_b綁定到IMessageA交換機,並且絕對是應該正在獲取它們。或者至少在我能夠通過管理Web UI檢查RabbitMQ的時候,沒有證據表明有消息傳送到queue_b(即,在queue_b_errorqueue_b_skippedqueue_b_skipped中沒有任何信息,後者甚至不存在)。

我已將IReceiveObserver添加到服務A和B,但沒有任何內容觸發ReceiveFaultConsumeFault

在服務質量上,消費者基本上是這樣做的:

var result = await MethodThatReturnsIMessageAResponse(messageA); 
context.Respond(result); 

爲什麼一個服務交付的郵件服務B的干擾?我甚至可以從哪裏開始尋找?

+0

你檢查了綁定?這個東西總是有效的,這是一個基本的功能。您是否嘗試過在此A服務中引發異常並查看消息是否進入錯誤隊列? –

+0

另外,你說如果服務A停止並且你發佈消息,他們會進入隊列。那麼當你啓動服務時,這些消息會發生什麼?他們從隊列中消失,這意味着他們被消耗? –

+0

當服務A停止時,如果我直接在RabbitMQ中手動發佈消息到'IMessageA'交換,它將被傳遞給'queue_a'和'queue_b',並且服務B能夠接收消息並使用它。如果我在此之後啓動服務A,它會接收消息並處理/消耗它。只有當服務A運行時,消息纔會進入'queue_b'。你會在我的問題的第一段中看到我已經檢查過了,綁定似乎是正確的,這就是爲什麼我對這個問題感到不知所措。 –

回答

0

問題是,我是「出版的」使用信息:

c.Resolve<IBus>().CreateRequestClient<IToDoMessage, IToDoMessageResponse>(new Uri(QueueAddress + QueueName),TimeSpan.FromSeconds(5)); 

這需要一個特定enpoint(例如隊列名稱)。相反,我需要使用CreatePublishRequestClient

c.Resolve<IBus>().CreatePublishRequestClient<IToDoMessage, IToDoMessageResponse>(TimeSpan.FromSeconds(5)); 

它採用總線公佈,並經過交流,而不是一個特定的隊列。它不幫助GitHub sample project顯示前...

相關問題