2013-08-15 6 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 }); 

각 콜백이 결과가 병렬로 실행되는겠습니까 _queueClient4 콜백은 실행 전에 _queueClient2 완료를 기다리지 않도록?

답변

10

OnMessage으로 콜백을 등록하면 다른 스레드에서 호출됩니다. MaxConcurrentCalls을 10으로 설정하면 10 개의 메시지에 대해 10 개의 스레드를 만들고 각 메시지에 대해 이들 모두를 동시에 콜백합니다. 위에서 설명한 것처럼 Queues 전체에서이 작업을 수행 할 수 있지만 물론 각 개별 콜백 처리 사이에 동기화 나 순서가 수행되지 않습니다.

새 스레드에서 콜백을 호출하면 메서드가 완료되거나 예외가 throw 될 때까지 메시지 처리가 완료되지 않는다는 점에서 해당 실행/메시지와 동기합니다. MaxConcurrentCalls이 0이면 등록 된 각 콜백에 대해 단일 스레드 만 처리됩니다. 그러나 다른 QueueClient 인스턴스가있는 경우 서로 다른 콜백을 등록하거나 동일한 콜백을 서로 다른 동시 카운트로 등록 할 수 있습니다.

+1

감사의 말 : 명확히하기 위해 : MaxConcurrentCalls를 10으로 설정하고 OnMessage를 호출하면 10 개의 스레드가 즉시 스핀 업됩니다. 대기열에서 메시지를 사용할 수있을 때까지 대기합니다. 그런 다음 각 스레드는 독립적으로 메시지를 처리합니다. 각 스레드는 콜백이 반환 될 때까지 다른 메시지를 처리 ​​할 수 ​​없습니다. –

+3

처리 할 메시지가있을 때만 스레드가 회전됩니다. 대기중인 Receive 호출은 하나 뿐이며 MaxConcurrentCalls 수에 도달 할 때까지받은 메시지에 대해 다른 스레드에서 콜백을 동시에 호출합니다. –

+0

FWIW -이 코드의 기본값은 1입니다. 따라서 기본적으로 OnMessage 패턴은 한 번에 하나의 스레드에서만 실행됩니다. – ProVega

관련 문제