Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 为什么即使没有消息排队,我的Azure Service Bus会话仍然存在?_Session_Azureservicebus - Fatal编程技术网

Session 为什么即使没有消息排队,我的Azure Service Bus会话仍然存在?

Session 为什么即使没有消息排队,我的Azure Service Bus会话仍然存在?,session,azureservicebus,Session,Azureservicebus,我有一个启用会话的Azure服务总线队列 我有一些使用WindowsAzure.ServiceBus NuGet包的代码。(Microsoft.ServiceBus.Messaging程序集) 在跨两个或三个会话ID处理多条消息后,使用BrokeredMessage.complete()将这些消息标记为已完成,并在每个会话上调用MessageSession.Close()(我已经验证了这一点),所有消息都已被使用,队列已清除 但是,当我调用QueueClient.GetMessageSessio

我有一个启用会话的Azure服务总线队列

我有一些使用WindowsAzure.ServiceBus NuGet包的代码。(Microsoft.ServiceBus.Messaging程序集)

在跨两个或三个会话ID处理多条消息后,使用BrokeredMessage.complete()将这些消息标记为已完成,并在每个会话上调用MessageSession.Close()(我已经验证了这一点),所有消息都已被使用,队列已清除

但是,当我调用QueueClient.GetMessageSessions()时,它返回两个会话,就好像它们没有完成一样

就我的一生而言,我找不到这个问题的答案: 是否有人知道任何情况/场景会使Azure Service Bus中的会话保持“打开”,即使在队列中的所有消息都已使用很久。至少就QueueClient.GetMessageSessions()调用而言

我试图在单独的测试中重现这个问题,但没有成功。产生了几个随机消息,做了一个混沌测试,我尝试将会话标记为关闭,而不是将它们标记为关闭,在错误的时间将它们标记为关闭。尽管如此,每次我旋转的测试队列都能很好地处理它,并且在“混沌”测试结束时返回当前会话数:0

换句话说,我不能复制这个

我反编译了Microsoft.ServiceBus.Messaging DLL,以查看从库的角度调用QueueClient.GetMessageSessions()时实际发生的情况:它实际上直接向Azure服务总线发送TCP/IP GetMessageSessions命令,并从那里接收响应。因此,这不是QueueClient实例包装调用并进行一些复杂的操作来推断有多少会话的情况。此信息直接来自Azure服务总线

我假设,即使我错过了对MessageSession.Close()的调用(这一点已通过测试得到确认),如果队列中没有消息可供锁定,则会话仍将被视为“已离开”。特别是在队列配置中等待超过任何到期日期/时间很长时间之后

即使在第二天,我仍然在读QueueClient.GetSessions()中针对该队列的2个会话。

哦,我终于明白了到底发生了什么

在“中断”的代码中,我使用MessageSession.SetState(Stream)设置了一些会话状态。在我的测试中,我忽略了做同样的事情,我无法重现这个问题。一旦我在测试中开始这样做,问题就重现了

总结: 显然,当您在会话上运行MessageSession.SetState(Stream-Stream)并且在完成会话时没有清除状态时,QueueClient.GetMessageSessions()调用仍然会返回这些会话,即使在技术上关闭它们之后——在我的例子中至少是几天后

至少对于今天的Azure Service Bus,如果不希望会话显示在QueueClient.GetMessageSessions()响应中,必须清除会话的状态

如果有人选择不清除状态,我还没有计算出这些会话从结果中“消失”需要多长时间。我知道在我的情况下,已经两天了,我仍然有一些会议出现

另外请注意:您不能调用QueueClient.GetMessageSessions(),然后对这些会话进行迭代并调用MessageSessions.SetState。此调用返回的会话实际上只是下面的SessionBrowser对象,因此该方法引发异常。必须在初始SessionHandler中清除状态