Почему BrokeredMessage.RenewLock() обновляет блокировку только на несколько секунд?

У меня есть класс BrokeredMessageContext, который использует Timer для периодической проверки и обновления блокировки экземпляра BrokeredMessage на случай, если процесс, обрабатывающий это сообщение, выполняется дольше, чем ожидалось. Он обновляет блокировку, вызывая метод RenewLock() для экземпляра BrokeredMessage.

Я ожидал, что этот вызов даст мне новую блокировку с тем же временем ожидания, что и исходная блокировка (MSDN утверждает, что "Вы можете продлевать блокировки на время, равное тайм-ауту блокировки объекта, и максимальной продолжительности продления блокировки нет."), но при отладке выясняется, что время ожидания блокировки увеличивается на «произвольные» 10-15 секунд. Я установил наблюдение за экземпляром BrokeredMessage и вижу, что к свойству LockedUntilUtc добавляется 10-15 секунд каждый раз, когда я вызываю RenewLock().

Кто-нибудь знает, почему это так? Можно ли что-нибудь сделать, чтобы продлить срок блокировки?

ИЗМЕНИТЬ:

Ответ Майка ниже правильный. Я обнаружил, что на самом деле пытался обновлять блокировку каждые десять секунд с самого начала, хотя мой код был предназначен для обновления блокировки сейчас, раньше, чем за двадцать секунд до истечения срока действия блокировки. Все сводилось к проблеме сравнения времени и тому факту, что время на моей машине было неправильным (оно опережало почти на минуту). О!


person Øyvind    schedule 29.01.2014    source источник


Ответы (1)


Когда вы вызываете RenewLock, он сбрасывает время, когда сообщение заблокировано параметром LockDuration, установленным в очереди или подписке, из которой извлекается сообщение. Если ваш класс, который выполняет обновление, имеет таймер, который срабатывает каждые 10-15 секунд, то поведение, которое вы видите, правильное.

Пример. У меня есть очередь с длительностью блокировки 1 минута (по умолчанию).
Я извлекаю сообщение в 1:20 UTC, поэтому значение LockedUntilUtc должно читаться как 1:21 UTC. Если через 10 секунд обработки я вызываю Renew lock, вызов срабатывает в 1:20:10, поэтому LockedUntilUtc станет 1:21.10.

Он добавил значение длительности блокировки к текущему времени на сервере, а не к предыдущему значению LockedUntilUtc. Это продлевает период блокировки сообщения.

Этот ответ предполагает, что вы часто запускаете триггер на таймере и не ждете, чтобы приблизиться к фактическому времени ожидания блокировки. Если вы хотите быть более точным, вы можете установить таймер на срабатывание примерно за 10-20 секунд до истечения срока действия блокировки, а затем обновить блокировку.

person MikeWo    schedule 29.01.2014
comment
Привет Майк, Спасибо за ваш ответ. Это не отражает того, что я вижу. У меня продолжительность блокировки 1 минута, и через 40 секунд я пытаюсь возобновить блокировку. Тем не менее, продолжительность блокировки увеличивается всего на 10 секунд или около того. - person Øyvind; 29.01.2014
comment
Тогда это определенно странно. Я попробовал это быстро, и обновления LockedUntilUtc были, как и ожидалось, с использованием как значения по умолчанию 1 минута, так и другого времени. Поэтому, основываясь на вашей проблеме, в какой-то момент я бы подумал, что блокировка закончится, так как ваш таймер в конечном итоге сработает после добавления количества времени. Вы это видите? Кроме того, может помочь, если вы предоставите некоторые примеры кода и/или времени? - person MikeWo; 29.01.2014
comment
Я собираюсь обновить свой вопрос и отметить ваш ответ как принятый ... После добавления большого количества журналов в мой код я обнаружил, что поведение, которое я мог видеть, было связано с проблемой сравнения времени. Ваш ответ абсолютно правильный. - person Øyvind; 30.01.2014
comment
Будьте осторожны с любыми прямыми сравнениями времени между серверами и клиентскими машинами. Дрейф часов происходит довольно часто в любой размещенной среде. - person MikeWo; 30.01.2014
comment
Ага. Отмеченный. Я переписал обработчик блокировки, так что он заботится только о продолжительности блокировки — он не полагается на сравнение времени UTC сервера и LockedUntilUtc. Спасибо, Майк. - person Øyvind; 30.01.2014
comment
Могу ли я обновить блокировку после истечения срока действия блокировки? Например, через 5 минут, если попытаться обновить блокировку, появится сообщение о том, что блокировка истекла!! - person Rusty; 04.06.2014
comment
@Øyvind Итак, как вы переписали его, чтобы он не зависел от времени на стороне клиента? - person Botis; 03.07.2017