如果客户端无法调用Close,什么控制MessageSession锁定何时到期?

问题描述 投票:0回答:1

上下文:关于Service Bus队列和消息会话的MSDN文档说:“当MessageSession对象被接受并且由客户端持有时,该客户端对具有该队列或订阅中存在的该会话的SessionId的所有消息拥有独占锁定,并且还有会话持有时仍然到达的SessionId的所有消息。

在调用Close或CloseAsync时,或者在应用程序无法执行关闭操作的情况下锁定到期时,将释放锁定“

我的解释:我正在解释上述内容,意味着MessageSession对队列会话有锁定,这就是为什么其他客户端无法使用相同的SessionID调用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();
azure azureservicebus azure-servicebus-queues
1个回答
1
投票

你的解释是正确的。控制会话锁定的是与代理的连接。一旦连接丢失,会话可以由另一个客户端打开。 LockDuration用于个人消息,而不是会话。因此,只要客户端通过打开会话连接到代理,该会话将保持锁定状态。一旦连接丢失,会话将由另一个请求客户端打开。但是一次只能有一个客户端确保有序的消息处理。

© www.soinside.com 2019 - 2024. All rights reserved.