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分钟后锁定将自动释放.
我和我的工人也有同样的问题。即使消息已成功处理,由于处理时间较长,服务总线也会删除对其应用的锁定,并且该消息可以再次接收。其他可用的工作人员接收此消息并再次开始处理它。如果我错了,请纠正我,但在您的情况下,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)
自您的帖子以来,有一些安装,也许您已经解决了这个问题,所以您可以分享您的解决方案吗?