0

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

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

我尝试运行相同的 webjob使用来自不同主题的消息以及后来的设置,它工作正常。是否会出现这种行为,以及此设置更改通常会在多长时间后反映出来。

任何帮助都会很棒

4

2 回答 2

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。

于 2017-06-19T07:28:47.160 回答
1

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

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

于 2017-06-16T18:34:21.893 回答