我可以在锁定时间过期后续期吗?使用Azure服务总线主题

本文关键字:Azure 使用 服务 总线 锁定 定时间 过期 我可以 | 更新日期: 2023-09-27 18:06:29

使用Azure服务总线主题

例如,5分钟后如果尝试更新锁,它会显示锁已过期的消息!!

有什么其他的选择来克服它…

我有超过5分钟的事务,之后我想将代理消息状态设置为已完成。

选项吗?

我可以在锁定时间过期后续期吗?使用Azure服务总线主题

要添加到Sam的答案中,如果锁定持续时间已过,则无法更新该消息上的锁。一旦锁过期,消息就可以分发给另一个消费者。这意味着,如果允许您在锁过期后调用renew lock,则可能有其他人正在处理该消息,并且就服务总线而言,它已经被其他消费者锁定。有人可能会说,如果RenewLock检查消息是否已经再次发出并更新,那将是"很好的",但它并没有这样做。如果您有足够的消费者,并且消息被粗略地按顺序处理,那么消息很可能已经在其他地方关闭了。

如果您有一个工作单元花费超过5分钟的场景,您将需要在处理期间或在单独的线程上管理续订。例如,如果你的处理是你做一些工作的地方,并且控制流经常返回到你的代码中,处理线程可以关注时间的数量并在必要时更新;但是,更有可能的情况是您的处理线程很忙,在这种情况下,您希望有一个单独的线程来处理续订。

您可以查看您的系统正在处理什么,并查看是否可以将其分解为更小的工作块并分布在一系列队列中。

您可以使用这里记录的RenewLock()方法:http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.renewlock.aspx

QueueClient queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName);
BrokeredMessage receivedMessage = await queueClient.ReceiveAsync();
await receivedMessage.RenewLockAsync();

您还可以查看这篇关于如何使用服务总线实现可靠消息传递循环的文章:http://msdn.microsoft.com/en-us/library/hh851750.aspx