我有一个Web作业,通过注册OnMessage
回调来使用来自Azure Service Bus主题的消息。 消息锁定持续时间设置为 30秒,锁定续订超时设置为 60秒。由于处理服务总线消息的工作时间超过 30秒,因此锁定已过期异常。
现在,我已将消息锁定持续时间设置为超过锁定续订超时。但不知何故,它仍然会抛出相同的异常。我也重新启动了我的webjob,但仍然没有运气。
我尝试使用以后设置运行相同的webjob 消费来自不同主题的消息,并且工作正常。是否需要此行为,并且此设置更改通常会反映多长时间。
任何帮助都会很棒
答案 0 :(得分:3)
我已将消息锁定持续时间设置为超过锁定续订超时。但不知何故,它仍然会抛出相同的异常。
锁定持续时间的最大值为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。
答案 1 :(得分:1)
应立即反映设置。锁定续订也应该超过锁定持续时间或禁用。
锁定续订功能是ASB客户端功能,它不会覆盖在实体上设置的锁定持续时间。如果您可以重现此问题并共享repro,请向Microsoft提出支持问题。