#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
предназначено для отдельных сообщений, а не для сеанса. Таким образом, пока клиент подключен к брокеру с открытым сеансом, этот сеанс будет оставаться заблокированным. Как только соединение будет потеряно, сеанс будет открыт другим запрашивающим клиентом. Но только по одному клиенту за раз, чтобы обеспечить упорядоченную обработку сообщений.