【问题标题】:Azure Service Bus Topic Subscriber lock expired exceptionAzure 服务总线主题订阅者锁定过期异常
【发布时间】:2017-11-19 09:39:53
【问题描述】:

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

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

我尝试使用 稍后 设置运行 same webjob 使用来自 不同主题 的消息,并且效果很好。是否会出现这种行为,以及此设置更改通常会在多长时间后反映出来。

任何帮助都会很棒

【问题讨论】:

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


    【解决方案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。

    【讨论】:

    • 我对@9​​87654323@ 的唯一问题是这不是保证操作,文档也没有说明。这是一个客户端操作,这意味着它可能会失败并且不会发生锁更新。 weblogs.asp.net/sfeldman/azure-service-bus-autorenewtimeout
    • 如果您想对锁更新操作进行更多控制,您可以调用博客中提到的 RenewLock 方法。
    • 正确。就在那时您失去了 OnMessage API 的便利性。无论哪种方式,我的评论只是提到应该小心处理对 AutoRenewTimeout 的依赖。谢谢。
    • @Amor-MSFT ,增加 AutoRenewTimeout 对我有用。我做了一些测试,奇怪的是当 AutoRenewTimeout 设置为
    • 我们在哪里设置锁定持续时间和自动锁定更新选项?我可以在 MessageHandlerOptions 中看到 AutoRenewTimeout,但在此或 SubscriptionClient 中的任何地方都看不到 LockDuration 属性。我想设置锁定超时和自动锁定更新时间。 (我使用的是 aspnet 核心库“Microsoft.Azure.ServiceBus”)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-23
      • 2018-07-18
      • 2018-08-27
      • 2016-02-10
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多