c# - 为什么 BrokeredMessage.RenewLock() 只更新几秒钟的锁?

标签 c# azure servicebus brokeredmessage

我有一个 BrokeredMessageContext 类,它使用 Timer 定期检查和更新 BrokeredMessage 实例上的锁,以防处理此消息的进程运行时间超过预期。它通过调用 BrokeredMessage 实例上的 RenewLock() 方法来更新锁定。

我预计此调用会给我一个与原始锁 ( MSDN states that "You can renew locks for the same duration as the entity lock timeout, and there is no maximum duration for a lock renewal." ) 具有相同超时的新锁,但在调试时,似乎锁超时增加了“任意”10-15 秒。我在 BrokeredMessage 实例上设置了监视,可以看到每次调用 RenewLock() 时,LockedUntilUtc 属性都会添加 10-15 秒。

有谁知道为什么会这样吗?有什么办法可以延长锁的更新时间吗?

编辑:

下面迈克的回答是正确的。我发现,事实上,我从一开始就尝试每十秒更新一次锁,尽管我的代码原本打算在锁到期前二十秒之前更新锁。这一切都归结为时间比较问题以及我机器上的时间错误(提前了近一分钟)这一事实。哦!

最佳答案

当您调用 RenewLock 时,它会重置消息被拉取消息的队列或订阅上设置的 LockDuration 锁定的时间。如果执行更新的类有一个每 10-15 秒触发一次的计时器,那么您看到的行为是正确的。

示例: 我有一个锁定持续时间为 1 分钟(默认)的队列。
我在 UTC 凌晨 1:20 提取消息,因此 LockedUntilUtc 应显示为 UTC 凌晨 1:21。 如果在处理 10 秒后我调用 Renew lock,则该调用会在凌晨 1:20:10 触发,因此 LockedUntilUtc 将变为凌晨 1:21.10。

它将锁定持续时间值添加到服务器的当前时间,而不是之前的 LockedUntilUtc 值。这会延长您对消息的锁定期限。

这个答案假设您经常触发计时器上的触发器,而不是等待接近实际的锁定超时。如果您想要更精确,您可以将计时器设置为在锁定到期前大约 10-20 秒触发,然后更新锁定。

关于c# - 为什么 BrokeredMessage.RenewLock() 只更新几秒钟的锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21433482/

相关文章:

c# - 锯齿状数组,从List <string>填充它们

azure - 科达服务总线: All the messages getting processed by some pods of keda scaledJob

azure - 更改 Azure 服务总线命名空间名称

C# 正则表达式精确长度

c# - 从未知来源转换C#数据类型

c# - 如何使用 C# 选择 CodeDom 编译器的目标框架?

azure - 如何查询Azure服务总线中$DeadLetterQueue的MessageCount?

node.js - 机器人在本地工作,但在机器人服务上没有响应

c# - 在 Azure 中发布时 Web 应用程序行为不同

azure - 如何处理 Azure 服务总线上的消息正文类型