2016-12-02 48 views
0

我們目前正在爲MassTransit轉換NServiceBus,我在請求/響應模式中遇到了一些困難。MassTransit響應進入同一隊列並導致循環

NServiceBus,我可以在Handler做回覆,並回到發送它的客戶端。

MassTransit,看起來好像響應被送回,它是從,從而創建一個循環消耗的隊列......

奇怪的事情,如果我創建使用InMemory總線,和客戶端和客戶端在同一臺機器上,我沒有問題。

我期待我的客戶搭上了迴應,而是我Consumer將它拾起,這也是奇怪,因爲它不是設置接收該消息類型...

我缺少在客戶端的東西請求設置?

客戶:

.... 
IRequestClient<IWorklistRequest, IWorklistResponse> client = CreateRequestClient(busControl, WorklistEndpointUri); 

Console.Write("Sending Request"); 

Task.Run(async() => 
{ 
    IWorklistRequest request = new WorklistRequest 
    { 
     CurrentDateFrom = new DateTime(2016, 11, 07) 
    }; 

    var response = await client.Request(request); 

    Console.WriteLine("Worklist Items retrieved: {0}", response.ExamItemList.Length); 

}).Wait(); 
.... 



static IRequestClient<IWorklistRequest, IWorklistResponse> CreateRequestClient(IBusControl busControl, string endpointAddress) 
{ 
    Console.WriteLine("Creating Request client..."); 

    var serviceAddress = new Uri(endpointAddress); 
    IRequestClient<IWorklistRequest, IWorklistResponse> client = 
    busControl.CreateRequestClient<IWorklistRequest, IWorklistResponse>(serviceAddress, TimeSpan.FromSeconds(10)); 

    return client; 
} 

消費者:

public Task Consume(ConsumeContext<IWorklistRequest> context) 
    { 
     _log.InfoFormat("Received Worklist Request with Id: {0}", context.RequestId); 


     try 
     { 
      var result = _provider.GetAllWorklistsByStartDate(context.Message.CurrentDateFrom); 

      IWorklistResponse response = new WorklistResponse 
      { 
       ExamItemList = result.ToArray() 
      }; 

      // the below is sending the response right back to the original queue and is getting picked up again by this same consumer 
      context.Respond(response); 
     } 
     catch (Exception ex) 
     { 
      _log.Info(ex.Message); 
     } 

     return Task.FromResult(0); 
    } 

回答

1

如果您正在使用RabbitMQ的,並且您正在使用請求的客戶端,你不應該看到此行爲。

有演示如何使用請求客戶端上的MassTransit GitHub的儲存庫中的樣本:https://github.com/MassTransit/Sample-RequestResponse

上面的代碼看起來是正確的,並且Respond()呼叫應當使用從請求消息,響應地址,該地址是發送到臨時總線地址的直接端點。

這個區域有相當廣泛的單元測試覆蓋範圍,上面的示例已更新並通過最新版本的MassTransit進行了驗證。您可以考慮刪除/重新創建您的RabbitMQ虛擬主機並從頭開始運行您的應用程序(首先啓動響應服務,以便設置端點)。

+0

是的,這是我實際上正在與實施指導我的示例...我會看看是否重新創建RabbitMq主機可能會解決這個問題,它是我用NServiceBus現有的。 – ragerory

+0

刪除並重新創建了RabbitMQ主機,問題仍然存在。它說它無法找到響應端點。當客戶端和總線都在同一臺機器上時,這不是問題。 – ragerory

+0

這兩種服務都使用相同的地址連接到RabbitMQ?或者是其中一個使用不同的主機地址?例如,一個使用本地主機,另一個使用網絡名稱?此外,請勿使用RabbitMQ遠程訪客帳戶。 –