如果客户端无法调用“关闭”,什么控制MessageSession锁何时到期?

时间:2019-03-11 20:27:29

标签: azure azureservicebus azure-servicebus-queues

上下文:有关服务总线队列和消息会话的MSDN文档说:“当MessageSession对象被接受并由客户端持有时,该客户端对该会话的所有消息都拥有排他锁队列或订阅中存在的SessionId,以及在会话保持期间仍到达的所有带有该SessionId的消息上。

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

我的解释:我将以上解释解释为MessageSession在队列会话上具有锁定,这就是为什么其他客户端无法使用相同的SessionID调用AcceptMessageSessionAsync的原因-获取SessionCannotBeLockedException。

问题:假设我的解释是正确的,那么在应用程序无法执行关闭操作的情况下,什么控制何时到期?我知道队列 上的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 个答案:

答案 0 :(得分:1)

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