2017-06-16 153 views
0

我有一個web作業,它通過註冊OnMessage回調消耗Azure服務總線主題的消息。所述消息鎖持續時間設定爲30秒鎖更新超時60秒。由於此類工作採取超過30秒來處理服務總線消息正在得到鎖過期異常。Azure服務總線主題訂戶鎖定已過期異常

現在,我已將消息鎖定持續時間設置爲多於鎖定更新超時。但不知何故,它仍然會拋出同樣的例外。我也重新啓動了我的webjob,但仍然沒有運氣。

我試着用設置運行相同webjob消耗來自不同的主題消息和它工作正常。預期這種行爲,以及此設置更改通常會反映多長時間。

任何幫助將是巨大的

回答

1

我已將消息鎖定持續時間設置爲超過鎖定更新超時。但不知何故,它仍然會拋出同樣的例外。

鎖定時間的最大值是5分鐘。 如果您需要不到5分鐘來處理作業,您可以增加郵件的鎖定時間以滿足您的要求。

如果您需要超過5分鐘來處理您的工作,您需要設置OnMessageOptions的AutoRenewTimeout屬性。如果鎖在到達AutoRenewTimeout之前到期,它將更新鎖。例如,如果將鎖定持續時間設置爲1分鐘並將AutoRenewTimeout設置爲5分鐘。如果您不釋放鎖,該消息將保持鎖定長達5分鐘。

下面是我用來測試在我的側面的鎖定時間和AutoRenewTimeout的代碼示例。如果作業花費的時間超過了鎖定時間和AutoRenewTimeout,它會在我們完成消息時發出異常(這意味着超時發生)。我還修改了門戶上的鎖定持續時間,並且配置將在我收到消息時立即應用。

SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, "topic name", "subscription name"); 

// Configure the callback options. 
OnMessageOptions options = new OnMessageOptions(); 
options.AutoComplete = false; 
options.AutoRenewTimeout = TimeSpan.FromSeconds(60); 

Client.OnMessage((message) => 
{ 
    try 
    { 
     //process the message here, I used following code to simulation a long time spent job 
     for (int i = 0; i < 30; i++) 
     { 
      Thread.Sleep(3000); 
     } 
     // Remove message from subscription. 
     message.Complete(); 
    } 
    catch (Exception ex) 
    { 
     // Indicates a problem, unlock message in subscription. 
     message.Abandon(); 
    } 
}, options); 

對於您的問題,請檢查您的工作需要花費多少時間並選擇正確的方式來設置鎖定時間和AutoRenewTimeout。

+0

我有唯一的問題'OnMessageOptions.AutoRenewTimeout'是沒有保證的操作和文檔沒有狀態,因此。這是客戶端操作,這意味着它可能會失敗,鎖定續約不會發生。 HTTPS://weblogs.asp。net/sfeldman/azure-service-bus-autorenewtimeout –

+0

如果您想對鎖更新操作執行更多控制,您可以調用博客中提到的RenewLock方法。 – Amor

+0

正確。只是這樣你就失去了OnMessage API的便利。無論哪種方式,我的評論只是提到,應該小心處理對AutoRenewTimeout的依賴。謝謝。 –

1

的設置,應立即反映出來。同時鎖定續約應該可能超過鎖定時間或禁用。

鎖更新功能是ASB客戶端功能,它不會覆蓋實體上設置的鎖持續時間。如果您可以重現此問題並共享repro,請向Microsoft提出支持問題。