Azure Service Bus主题订阅者锁定已过期异常

时间:2017-06-16 14:46:50

标签: c# azure-webjobs azureservicebus azure-servicebus-topics

我有一个Web作业,通过注册OnMessage回调来使用来自Azure Service Bus主题的消息。 消息锁定持续时间设置为 30秒锁定续订超时设置为 60秒。由于处理服务总线消息的工作时间超过 30秒,因此锁定已过期异常。

现在,我已将消息锁定持续时间设置为超过锁定续订超时。但不知何故,它仍然会抛出相同的异常。我也重新启动了我的webjob,但仍然没有运气。

我尝试使用以后设置运行相同的webjob 消费来自不同主题的消息,并且工作正常。是否需要此行为,并且此设置更改通常会反映多长时间。

任何帮助都会很棒

2 个答案:

答案 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提出支持问题。