指导OnMessageOptions.AutoRenewTimeout

Luk*_*kie 14 azure azureservicebus azure-servicebus-queues

有人可以提供有关使用Azure Service Bus OnMessageOptions.AutoRenewTimeout的更多指导 http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.autorenewtimeout.aspx

因为我没有找到关于此选项的大量文档,并且想知道这是否是更新消息锁的正确方法

我的用例:

1)消息处理队列的锁定持续时间为5分钟(允许的最大值)

2)消息处理器使用OnMessageAsync消息泵从队列中读取(使用ReceiveMode.PeekLock)长时间运行的处理可能需要10分钟才能处理消息,然后再手动调用msg.CompleteAsync

3)我希望消息处理器自动更新它的锁定,直到预期完成处理的时间(~10分钟).如果在此期间之后尚未完成,则应自动释放锁定.

谢谢

- 更新

我从来没有最终获得有关AutoRenewTimeout的更多指导.我最终使用自定义MessageLock类,根据计时器自动更新消息锁.

请参阅要点 - https://gist.github.com/Soopster/dd0fbd754a65fc5edfa9

小智 14

要处理长消息处理,您应该设置AutoRenewTimeout== 10分钟(在您的情况下).这意味着每次LockDuration过期时,锁定将在这10分钟内更新.

因此,例如,如果你LockDuration是3分钟并且AutoRenewTimeout是10分钟,则每3分钟锁定将自动更新(3分钟,6分钟和9分钟之后)并且在消息消耗后12分钟后锁定将自动释放.

  • 这是非常有用的解释.我在其他任何地方都找不到它.谢谢! (2认同)

A.K*_*nov 1

我和我的工人也有同样的问题。即使消息已成功处理,由于处理时间较长,服务总线也会删除对其应用的锁定,并且该消息可以再次接收。其他可用的工作人员接收此消息并再次开始处理它。如果我错了,请纠正我,但在您的情况下,OnMessageAsync 将使用相同的消息多次调用,最终您将有多个任务同时处理它。在进程结束时,将引发 MessageLockLost 异常,因为该消息没有应用锁。我用下面的代码解决了这个问题。

_requestQueueClient.OnMessage(
            requestMessage =>
            {
                RenewMessageLock(requestMessage);
                var messageLockTimer = new System.Timers.Timer(TimeSpan.FromSeconds(290));
                messageLockTimer.Elapsed += (source, e) =>
                {
                    RenewMessageLock(requestMessage);
                };
                messageLockTimer.AutoReset = false; // by deffault is true
                messageLockTimer.Start();

                /* ----- handle requestMessage ----- */

                requestMessage.Complete();

                messageLockTimer.Stop();
            }

 private void RenewMessageLock(BrokeredMessage requestMessage)
    {
        try
        {
            requestMessage.RenewLock();
        }
        catch (Exception exception)
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

自您的帖子以来,有一些安装,也许您已经解决了这个问题,所以您可以分享您的解决方案吗?