2016-04-12 8 views
1

(MSMQ)キューに表示される単一のメッセージの受信時に、多数のWebサービスコールをバッチする必要があります。Rebusを使用したスキャッタ/ギャザー

「サガ」は行く方法ですか?

第三者Webサービスとのやりとりは、一度呼び出す必要があるためさらに複雑になります。次に、相関IDを持つ確認応答をポーリングして、Webサービスの初期呼び出しへの返信で返されます。

答えて

0

はい、sagasは、呼び出しを開始し、操作が終了するまでポーリングし、すべての作業が完了したときに何か別の処理を行うプロセスを調整する方法です。

Rebusのasync機能を使用してポーリングを簡単に行うことができます。私は現在、基本的にこれを行う何かを構築中です:

public async Task Handle(SomeMessage message) 
{ 
    var response = await _client.Get<SomeResponse>("https://someurl") ; 
    var pollUrl = response.PollUrl; 
    var resultUrl = response.ResultUrl; 

    while(true) 
    { 
     var result = await _client.Get<PollResult>(pollUrl); 

     if (result.Status == PollStatus.Processing) 
     { 
      await Task.Delay(TimeSpan.FromSeconds(2)); 
      continue; 
     } 

     if (result.Status == PollStatus.Done) 
     { 
      var finalResult = await _client.Get<FinalResult>(resultUrl); 

      return new SomeReply(finalResult);; 
     } 

     throw new Exception($"Unexpected status while polling {pollUrl}: {result.Status}") 
    } 
} 

は、このように、それが処理している間、私たちの最後に最小限のリソースを消費しながら、外部のWebサービスをポーリングするasync/awaitを活用して。

関連する問題