2013-08-15 24 views
9

Phương thức QueueClient.OnMessage có luôn thực hiện tham số gọi lại trên một luồng khác không?Azure ServiceBus QueueClient.OnMessage có thực hiện trên một luồng khác

Tôi giả định rằng nếu MaxConcurrentCalls được đặt thành 10 thì queueClient sẽ quay lên tối đa 10 luồng để xử lý các thư song song. Có một chủ đề mới được tạo ra nếu bạn vượt qua trong một giá trị MaxConcurrentConnection 1 hoặc hiện nó thực hiện trở lại trên thread hiện tại?

Vấn đề thực tế của tôi:
Trong vai trò công nhân Tôi muốn xử lý nhiều hàng đợi nhưng có tất cả quá trình đồng thời. Ví dụ.

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

Điều này có dẫn đến mỗi cuộc gọi lại được thực thi song song để gọi lại _queueClient4 không chờ _queueClient2 hoàn tất trước khi có thể thực thi?

Trả lời

10

Khi bạn đăng ký gọi lại với OnMessage, nó được gọi trên một chủ đề khác. Nếu bạn đặt MaxConcurrentCalls để nói 10, thì chúng tôi sẽ tạo 10 chuỗi cho 10 thư và gọi lại tất cả các thư này cho mỗi thư cùng một lúc. Bạn cũng có thể thực hiện điều này trên các Hàng đợi như bạn đã trình bày ở trên, nhưng tất nhiên không có sự đồng bộ hoặc thứ tự được thực hiện giữa mỗi lần xử lý gọi lại riêng lẻ.

Khi chúng ta gọi hàm gọi lại trên một chuỗi mới, thì nó sẽ đồng bộ cho thông báo/thực hiện cụ thể đó cho đến khi phương thức hoàn thành hoặc ngoại lệ được ném, quá trình xử lý tin nhắn chưa hoàn thành. Nếu MaxConcurrentCalls là 0 thì chỉ một luồng duy nhất sẽ được xử lý cho mỗi lần gọi lại đã đăng ký. Tuy nhiên khi bạn có các trường hợp QueueClient khác nhau, bạn có thể đăng ký các callback khác nhau cho chúng hoặc cùng một cuộc gọi lại với các số lượng đồng thời khác nhau, v.v.

+1

Cảm ơn Abhishek, chỉ cần làm rõ: Nếu tôi gọi OnMessage với MaxConcurrentCalls đặt thành 10 thì 10 chuỗi sẽ được tách ngay lập tức mà chờ cho đến khi tin nhắn có sẵn trên hàng đợi. Sau đó, mỗi luồng xử lý độc lập một thông điệp; mỗi luồng không có sẵn để xử lý bất kỳ tin nhắn nào khác cho đến khi nó trở về? –

+3

Chủ đề chỉ được tách ra khi có thông báo để xử lý. Chỉ có một cuộc gọi nhận đang chờ xử lý và gọi các cuộc gọi lại đồng thời trên các luồng khác nhau cho các thư đã nhận cho đến khi đạt đến số lượng MaxConcurrentCalls. –

+0

FWIW - Phản ánh vào mã, giá trị mặc định cho điều này là 1, do đó, theo mặc định có vẻ như mẫu OnMessage sẽ chỉ chạy trên một chuỗi duy nhất tại một thời điểm. – ProVega

Các vấn đề liên quan