Почему BrokeredMessage.RenewLock() обновляет блокировку только на несколько секунд?
У меня есть класс BrokeredMessageContext, который использует Timer для периодической проверки и обновления блокировки экземпляра BrokeredMessage в случае, если процесс, обрабатывающий это сообщение, выполняется дольше, чем ожидалось. Он возобновляет блокировку, вызывая метод RenewLock() в экземпляре BrokeredMessage.
Я ожидал, что этот вызов даст мне новую блокировку с тем же временем ожидания, что и исходная блокировка ( MSDN заявляет, что "вы можете возобновить блокировки на ту же продолжительность, что и время ожидания блокировки объекта, и максимальная длительность для возобновления блокировки отсутствует"), но при отладке кажется, что таймаут блокировки увеличивается на "произвольные" 10-15 секунд. Я установил наблюдение за экземпляром BrokeredMessage и вижу, что свойство LockedUntilUtc добавляет к нему 10-15 секунд каждый раз, когда я вызываю RenewLock().
Кто-нибудь знает, почему это так? Можно ли что-нибудь сделать, чтобы продлить замок на более длительный срок?
РЕДАКТИРОВАТЬ:
Ниже приведен правильный ответ Майка. Я обнаружил, что на самом деле пытался обновить блокировку каждые десять секунд с самого начала, даже если мой код был предназначен для восстановления блокировки раньше, чем за двадцать секунд до истечения срока действия блокировки. Все сводилось к проблеме сравнения времени и тому факту, что время на моей машине было неправильным (оно было впереди почти на минуту). D'о!
1 ответ
Когда вы вызываете RenewLock, он сбрасывает время, когда сообщение заблокировано, с помощью параметра LockDuration, установленного в очереди или подписке, из которой извлекается сообщение. Если ваш класс, который выполняет обновление, имеет таймер, который срабатывает каждые 10-15 секунд, то поведение, которое вы видите, является правильным.
Пример: у меня очередь с продолжительностью блокировки 1 минута (по умолчанию).
Я извлекаю сообщение в 1:20 по UTC, поэтому LockedUntilUtc должен показывать 1:21 по UTC. Если через 10 секунд после обработки я вызываю блокировку Renew, звонок срабатывает в 1:20:10, поэтому LockedUntilUtc станет 1:21.10.
Он добавил значение длительности блокировки к текущему времени на сервере, а не к предыдущему значению LockedUntilUtc. Это продлевает ваш период блокировки сообщения.
В этом ответе предполагается, что вы часто запускаете триггер на таймере и не ждете, чтобы приблизиться к фактическому таймауту блокировки. Если вы хотите быть более точным, вы можете установить таймер на срабатывание примерно за 10-20 секунд до истечения срока действия блокировки, а затем выполнить возобновление блокировки.