- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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/
我有一个 BrokeredMessageContext 类,它使用 Timer 定期检查和更新 BrokeredMessage 实例上的锁,以防处理此消息的进程运行时间超过预期。它通过调用 Broke
我正在 .net Core 2.1 中编写一个控制台应用程序,我的目的是监听 ServiceBus 中某个主题的消息,并使用 NEST api 处理到达 Elasticsearch 的新消息(NEST
我是一名优秀的程序员,十分优秀!