8

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

我希望这个调用会给我一个与原始锁具有相同超时的新锁(MSDN 声明“您可以在与实体锁超时相同的持续时间内更新锁,并且锁更新没有最大持续时间。”) ,但在调试时,似乎锁定超时增加了“任意”10-15 秒。我在 BrokeredMessage 实例上设置了一个监视,我可以看到每次调用 RenewLock() 时 LockedUntilUtc 属性都会增加 10-15 秒。

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

编辑:

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

4

1 回答 1

13

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

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

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

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

于 2014-01-29T15:21:00.690 回答