2013-08-15 26 views
9

QueueClient.OnMessageメソッドは、常に別のスレッドでコールバックパラメータを実行しますか?Azure ServiceBus QueueClient.OnMessageは別のスレッドで実行されます

MaxConcurrentCallsを10に設定すると、queueClientはメッセージを並列に処理するために最大10個のスレッドをスピンアップすると仮定します。 MaxConcurrentConnectionの値を1に設定した場合、または現在のスレッドで実行した場合に新しいスレッドが作成されますか?

私の実際の問題:
ワーカーの役割の中で私は複数のキューを扱いたいと思いますが、すべてのプロセスを同時に処理したいと思います。例えば。

 _queueClient1.OnMessage(x => 
      { 
       // Do something 
      }, new OnMessageOptions { MaxConcurrentCalls = 1}); 

     _queueClient2.OnMessage(x => 
     { 
      // Do something 
     }, new OnMessageOptions { MaxConcurrentCalls = 1 }); 

     _queueClient3.OnMessage(x => 
     { 
      // Do something 
     }, new OnMessageOptions { MaxConcurrentCalls = 1 }); 

     _queueClient4.OnMessage(x => 
     { 
      // Do something 
     }, new OnMessageOptions { MaxConcurrentCalls = 1 }); 

それが実行できる前に_queueClient2が終了するの_queueClient4コールバックが待っていないように、この結果は、各コールバックで並列に実行されているでしょうか?

答えて

10

OnMessageでコールバックを登録すると、別のスレッドで呼び出されます。 MaxConcurrentCallsを10と設定すると、10個のメッセージに対して10個のスレッドを作成し、各メッセージに対してこれらのすべてを同時にコールバックします。上で示したように、キュー全体でこれを行うことはできますが、個々のコールバック処理の間に同期や順序付けは行われません。

新しいスレッドでコールバックを呼び出すと、メソッドが完了するか、例外がスローされるまで、メッセージ処理が完了しないという点で、特定の実行/メッセージと同期します。 MaxConcurrentCallsが0の場合、登録されたコールバックごとに1つのスレッドのみが処理されます。しかし、あなたが異なるQueueClientインスタンスを持っている場合は、別のコールバックを登録したり、同じコールバックを別の並行カウントなどで登録したりすることができます。

+1

私はMaxConcurrentCallsを10に設定してOnMessageを呼び出すと、メッセージはキューで使用可能になるまで待機します。次に、各スレッドは独立してメッセージを処理します。コールバックが返るまで、各スレッドは他のメッセージを処理できません。 –

+3

スレッドは、処理するメッセージがある場合にのみスピンアップされます。保留中のReceive呼び出しは1つだけで、MaxConcurrentCalls数に達するまで、受信メッセージの異なるスレッドでコールバックを同時に呼び出します。 –

+0

FWIW - コードを反映すると、このデフォルト値は1です。したがって、デフォルトでは、OnMessageパターンは一度に1つのスレッドでのみ実行されるように見えます。 – ProVega

関連する問題