Azure 服务总线主题订阅者锁过期异常

Azure Service Bus Topic Subscriber lock expired exception

我有一个 Web 作业,它通过注册 OnMessage 回调来使用来自 Azure 服务总线主题的消息。 消息锁定持续时间设置为30秒并且锁定更新超时设置为 60 秒。因此,处理服务总线消息花费超过 30 秒 的作业会出现 锁过期 异常。

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

我尝试运行相同的网络作业使用来自不同主题的消息后来 ] 设置,它工作正常。这种行为是预期的吗,此设置更改通常会在多长时间后反映出来。

任何帮助都会很棒

设置应该几乎立即反映出来。另外锁更新应该可能超过锁持续时间或禁用。

锁定续订功能是 ASB 客户端功能,它不会覆盖实体上设置的锁定持续时间。如果您可以重现此问题并分享重现,请向 Microsoft 提出支持问题。

I have set the message lock duration to more than lock renew time out. But somehow it still throws same exception.

锁定持续时间的最大值为 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。