2013-08-15 17 views
9

Czy metoda QueueClient.OnMessage zawsze wykonuje parametr wywołania zwrotnego w innym wątku?Czy kolejka Azure ServiceBus QueueClient.OnMessage jest uruchamiana w innym wątku

Zakładam, że jeśli MaxConcurrentCalls jest ustawiony na 10, to queueClient będzie rozpędzać maksymalnie 10 wątków, aby przetwarzać komunikaty równolegle. Czy nowy wątek zostanie utworzony, jeśli przekażesz wartość MaxConcurrentConnection równą 1 lub czy zostanie ona ponownie uruchomiona w bieżącym wątku?

Mój rzeczywisty problem:
W ramach roli pracownika chciałbym obsłużyć wiele kolejek, ale wszystkie je współbieżnie. Na przykład.

 _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 }); 

doprowadziłoby to do każdego zwrotnego wykonywane równolegle tak, że zwrotna _queueClient4 nie czeka na _queueClient2 aby zakończyć, zanim będzie można go wykonać?

Odpowiedz

10

Po zarejestrowaniu wywołania zwrotnego za pomocą numeru OnMessage jest wywoływany w innym wątku. Jeśli ustawisz MaxConcurrentCalls na 10, wtedy utworzymy 10 wątków dla 10 wiadomości i wszystkie te komunikaty wywołają dla każdej wiadomości jednocześnie. Możesz to zrobić również w Queues, jak pokazano powyżej, ale oczywiście nie ma synchronizacji ani zamawiania wykonanego między poszczególnymi procesami wywołania zwrotnego.

Kiedy wywołujemy wywołanie zwrotne w nowym wątku, to jest synchroniczne dla tego konkretnego wykonania/wiadomości, dopóki nie zostanie zakończona lub zostanie zgłoszony wyjątek, przetwarzanie komunikatu nie jest zakończone. Jeśli MaxConcurrentCalls ma wartość 0, dla każdego zarejestrowanego wywołania zwrotnego zostanie przetworzony tylko jeden wątek. Jednak, gdy masz różne instancje QueueClient, możesz zarejestrować różne wywołania zwrotne do nich lub to samo wywołanie zwrotne z różnymi licznikami jednoczesnymi itp.

+1

Dzięki Abhishek, tylko po to, aby wyjaśnić: jeśli zadzwonię do OnMessage przy MaxConcurrentCalls ustawionym na 10, 10 wątków zostanie natychmiast odwirowanych które czekają, aż komunikaty będą dostępne w kolejce. Następnie każdy wątek niezależnie przetwarza komunikat; każdy wątek jest niedostępny do przetwarzania innych komunikatów, dopóki nie zostanie zwrócone wywołanie zwrotne? –

+3

Wątki są odwirowywane tylko wtedy, gdy są komunikaty do przetworzenia. Istnieje tylko jedno oczekujące wywołanie Receive, które wywołuje jednocześnie wywołania zwrotne dla różnych wątków dla otrzymanych wiadomości, aż do osiągnięcia liczby MaxConcurrentCalls. –

+0

FWIW - Odbijając kod, domyślna wartość to 1, więc domyślnie wygląda na to, że wzorzec OnMessage będzie działał tylko na pojedynczym wątku naraz. – ProVega

Powiązane problemy