2015-01-14 16 views
14

Ai đó có thể cung cấp một số hướng dẫn thêm về việc sử dụng các Azure Service Bus OnMessageOptions.AutoRenewTimeout http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.autorenewtimeout.aspxHướng dẫn OnMessageOptions.AutoRenewTimeout

như tôi đã không tìm thấy nhiều tài liệu về tùy chọn này, và muốn biết nếu điều này là cách chính xác để làm mới một khóa nhắn

trường hợp sử dụng của tôi:

1) nhắn Processing Queue có Thời Khóa 5 phút (tối đa cho phép)

2) Bộ xử lý tin nhắn sử dụng máy bơm thông báo OnMessageAsync để đọc từ hàng đợi (với ReceiveMode.PeekLock) Quá trình xử lý dài có thể mất đến 10 phút để xử lý tin nhắn trước khi gọi bằng tay msg.CompleteAsync

3) Tôi muốn bộ xử lý tin nhắn tự động gia hạn, nó sẽ khóa cho đến khi nó được xử lý hoàn thành (~ 10 phút). Nếu sau thời gian đó nó chưa được hoàn thành, khóa sẽ tự động được giải phóng.

Cảm ơn

- CẬP NHẬT

Tôi không bao giờ đã kết thúc nhận được bất kỳ hướng dẫn thêm về AutoRenewTimeout. Tôi đã kết thúc bằng cách sử dụng một lớp MessageLock tùy chỉnh tự động gia hạn Khóa tin nhắn dựa trên bộ hẹn giờ.

Xem các ý chính - https://gist.github.com/Soopster/dd0fbd754a65fc5edfa9

Trả lời

1

Tôi có vấn đề rất giống với nhân viên của tôi. Ngay cả tin nhắn đã được xử lý thành công, do thời gian xử lý dài, bus dịch vụ xóa khóa được áp dụng cho nó và thông báo trở nên có sẵn để nhận lại. Nhân viên có sẵn khác nhận thông báo này và bắt đầu xử lý lại. Xin vui lòng, sửa tôi nếu tôi sai, nhưng trong trường hợp của bạn, OnMessageAsync sẽ được gọi nhiều lần với cùng một thông điệp và bạn sẽ kết thúc với một số nhiệm vụ đồng thời xử lý nó. Vào cuối của quá trình ngoại lệ MessageLockLost sẽ được ném bởi vì tin nhắn không có một khóa được áp dụng. Tôi đã giải quyết vấn đề này bằng mã sau.

_requestQueueClient.OnMessage(
      requestMessage => 
      { 
       RenewMessageLock(requestMessage); 
       var messageLockTimer = new System.Timers.Timer(TimeSpan.FromSeconds(290)); 
       messageLockTimer.Elapsed += (source, e) => 
       { 
        RenewMessageLock(requestMessage); 
       }; 
       messageLockTimer.AutoReset = false; // by deffault is true 
       messageLockTimer.Start(); 

       /* ----- handle requestMessage ----- */ 

       requestMessage.Complete(); 

       messageLockTimer.Stop(); 
      } 

private void RenewMessageLock(BrokeredMessage requestMessage) 
    { 
     try 
     { 
      requestMessage.RenewLock(); 
     } 
     catch (Exception exception) 
     { 

     } 
    } 

Có một vài gắn kết từ bài đăng của bạn và có thể bạn đã giải quyết vấn đề này, vì vậy bạn có thể chia sẻ giải pháp của mình.

12

Để xử lý việc xử lý tin nhắn dài, bạn nên đặt AutoRenewTimeout == 10 phút (trong trường hợp của bạn). Điều đó có nghĩa là khóa sẽ được gia hạn trong vòng 10 phút này mỗi lần khi LockDuration hết hạn. Vì vậy, ví dụ: LockDuration là 3 phút và AutoRenewTimeout là 10 phút thì mỗi 3 phút khóa sẽ được tự động gia hạn (sau 3 phút, 6 phút và 9 phút) và khóa sẽ tự động được phát hành sau 12 phút kể từ khi thư được tiêu thụ.

+2

Giải thích rất hữu ích. Tôi không thể tìm thấy nó ở bất cứ nơi nào khác. Cảm ơn! – ebashmakov