如果客户端无法调用 Close,什么控制 MessageSession 锁何时到期?
What controls when the MessageSession lock expires, if the client can't call Close?
Context:有关服务总线队列和消息会话的 MSDN 文档说“当 MessageSession 对象被接受并且由客户端持有时,该客户端持有独占锁队列或订阅中存在的具有该会话的 SessionId 的所有消息,以及在会话保持期间仍到达的具有该 SessionId 的所有消息。
在调用 Close 或 CloseAsync 时释放锁,或者在应用程序无法执行关闭操作的情况下锁过期"
我的解释:我将上面的解释解释为 MessageSession 锁定了队列会话,这就是为什么其他客户端无法使用相同的调用 AcceptMessageSessionAsync SessionID - 他们会得到一个 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();
你的解释是正确的。控制会话锁的是与代理的连接。一旦连接丢失,会话可以由另一个客户端打开。 LockDuration
用于单个消息,而不是会话。因此,只要客户端通过打开的会话连接到代理,该会话就会保持锁定状态。一旦连接丢失,会话将由另一个发出请求的客户端打开。但一次只有一个客户端,以确保按顺序处理消息。
Context:有关服务总线队列和消息会话的 MSDN 文档说“当 MessageSession 对象被接受并且由客户端持有时,该客户端持有独占锁队列或订阅中存在的具有该会话的 SessionId 的所有消息,以及在会话保持期间仍到达的具有该 SessionId 的所有消息。
在调用 Close 或 CloseAsync 时释放锁,或者在应用程序无法执行关闭操作的情况下锁过期"
我的解释:我将上面的解释解释为 MessageSession 锁定了队列会话,这就是为什么其他客户端无法使用相同的调用 AcceptMessageSessionAsync SessionID - 他们会得到一个 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();
你的解释是正确的。控制会话锁的是与代理的连接。一旦连接丢失,会话可以由另一个客户端打开。 LockDuration
用于单个消息,而不是会话。因此,只要客户端通过打开的会话连接到代理,该会话就会保持锁定状态。一旦连接丢失,会话将由另一个发出请求的客户端打开。但一次只有一个客户端,以确保按顺序处理消息。