2016-12-02 14 views
0

MassTransitのために現在NServiceBusを切り替えていますが、リクエスト/応答パターンに少し問題があります。MassTransit同じキューに入ってループが発生する

では、私はHandlerで返信でき、送信したクライアントに戻ります。応答は、このようにループを作成し、バックそれはから消費されたことをキューに送信されているかのようにそれが表示されます

MassTransit

、...

奇妙なことに、私はインメモリを使用してバスを作成していた場合、クライアントとコンシューマーの両方が同じマシン上にいる場合、私は問題はありません。

私はそれがそのメッセージ・タイプを受信するための設定はありませんから、また奇数である、それを応答をキャッチし、代わりに私の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に接続していますか?それとも、別のホストアドレスを使用しているのですか?たとえば、ローカルホストを使用し、もう1つはネットワーク名を使用しますか?また、RabbitMQでゲストアカウントをリモートで使用しないでください。 –

関連する問題