2015-11-10 69 views
1

有關於地下ESB軌道交通:沒有消費者

我想MassTransit首次,並試圖讓我的頭圍繞如何創建隊列和消息是如何消費的新手問題。

我有一個Web應用程序和控制檯應用程序試圖做發佈/分別

這是我的初始化代碼消耗。

var bus = Bus.Factory.CreateUsingRabbitMq(sbc => 
      { 
       var host = sbc.Host(new Uri(hostName), h => 
       { 
        h.Username(userName); 
        h.Password(password); 
       }); 

      }); 

然後從web應用程序調用以下代碼。

using (Bus.Start()) 
      { 
       var pubr = Bus.Publish<T>(message); 

       pubr.Wait(); 

      } 

這會導致消息在Rabbit MQ中丟失。

如果我在控制檯應用程序中添加使用者,我可以使示例工作。

sbc.ReceiveEndpoint(host, 
        e => 
         e.Consumer<LoginEventConsumer>(d => { }) 
       { } 

我的問題是爲什麼我的消息如果沒有消費者會丟失?

它看起來像兔子MQ認爲沒有隊列連接到交易所,因此消息丟失。那是對的嗎 ?有沒有辦法在初始化期間創建隊列和交換,而不會混淆具有大量隨機命名隊列/交換的Rabbit MQ?

看起來像我缺少一些非常基本的東西,我理解MassTransit/Rabbit MQ的工作原理。我認爲這是一種非常普遍的情況,即消費者註冊發生在發佈事件後的較晚時間點,並且消費者在連接後將發送所有已發佈的項目。

回答

5

RabbitMQ由交換和隊列組成。

交換是基於消息類型發佈消息時由MassTransit創建的。發佈不會創建任何隊列。隊列是存儲消息以傳遞給消費者的地方。

將接收端點添加到總線時創建隊列。對於消費者,處理程序和sagas添加到接收端點,創建和綁定交換,以便發佈到交換的消息由接收端點(通過隊列)接收。

直到接收端點啓動,並且在RabbitMQ(exchange-exchange-queue綁定)中配置了它們的拓撲結構後,由於沒有綁定到任何隊列,所以發佈的任何消息都不會被髮送。一旦接收端點啓動,那些綁定就存在,消息將被傳送到隊列中。

相關問題