Что контролирует, когда истекает срок блокировки MessageSession, если клиент не может вызвать Close?

#azure #azureservicebus #azure-servicebus-queues

#azure #azureservicebus #azure-servicebus-очереди

Вопрос:

Контекст: Документация MSDN по очередям служебной шины и сеансам сообщений гласит: «Когда объект MessageSession принимается и пока он удерживается клиентом, этот клиент сохраняет эксклюзивную блокировку для всех сообщений с идентификатором сеанса этого сеанса, которые существуют в очереди или подписке, а также для всех сообщений с этим идентификатором сеанса, которые все еще поступают во время сеанса.

Блокировка снимается при вызове Close или CloseAsync или по истечении срока действия блокировки в случаях, когда приложение не может выполнить операцию закрытия«

Моя интерпретация: Я интерпретирую вышесказанное как означающее, что MessageSession имеет блокировку сеанса очереди, поэтому другие клиенты не могут вызвать AcceptMessageSessionAsync с тем же идентификатором сеанса — они получат исключение SessionCannotBeLockedException.

Вопрос: Предполагая, что моя интерпретация верна, что контролирует, когда истечет срок действия блокировки MessageSession в случаях, когда приложение не может выполнить операцию закрытия? Я знаю, что LockDuration в очереди не выполняет этого, потому что я пробовал это.

Пример кода:

 var sessionClient = new SessionClient(ServiceBusConnectionString, QueueName, ReceiveMode.PeekLock);
var session = await sessionClient.AcceptMessageSessionAsync("0");
// ReceiveAsync seems to wait for 60 seconds, 
// even if the LockDuration on the queue is 30 seconds. 
var message = await session.ReceiveAsync();
// Once ReceiveAsync returns, I'd expect to receive a SessionLockLost
// exception at some point since the lock should expire, according to MSDN
Console.ReadKey();
  

Ответ №1:

Ваша интерпретация верна. Что управляет блокировкой сеанса, так это соединение с брокером. После потери соединения сеанс может быть открыт другим клиентом. LockDuration предназначено для отдельных сообщений, а не для сеанса. Таким образом, пока клиент подключен к брокеру с открытым сеансом, этот сеанс будет оставаться заблокированным. Как только соединение будет потеряно, сеанс будет открыт другим запрашивающим клиентом. Но только по одному клиенту за раз, чтобы обеспечить упорядоченную обработку сообщений.