Azure服务总线:AcceptMessageSession超时
本文关键字:AcceptMessageSession 超时 总线 服务 Azure | 更新日期: 2023-09-27 18:26:33
对于我的服务总线实现,我需要对超过特定大小的消息进行分段,然后在收到所有分段后重新组装它们。
当使用竞争的队列客户端(例如,多个工作角色实例)时,使用会话来确保同一实例接收到具有匹配会话ID的所有消息是很有用的。根据我遇到的所有在线教程,这是如下实现的:
_namespaceManager = CreateNamespaceManager(sharedAccessKey, nameSpace);
_messagingFactory = MessagingFactory.Create(_namespaceManager.Address, _namespaceManager.Settings.TokenProvider);
var qd = new QueueDescription("SessionQueue") { RequiresSession = true };
_namespaceManager.CreateQueue(qd);
var sender = _messagingFactory.CreateQueueClient("SessionQueue");
var qc = _messagingFactory.CreateQueueClient("SessionQueue", ReceiveMode.ReceiveAndDelete);
var ms = qc.AcceptMessageSession();
然而,最后一行总是挂起,并最终超时。我尝试过使用不同的连接协议,比如使用NamespaceManager.CreateFromConnectionString
创建名称空间管理器,但结果完全相同。
AcceptMessageSession
可能挂成这样有什么原因吗?
以下是CreateNamespaceManager
:的实现
public static NamespaceManager CreateNamespaceManager(string sharedAccesskey, string nameSpace)
{
var uri = ServiceBusEnvironment.CreateServiceUri("sb", nameSpace, string.Empty);
var tP = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sharedAccesskey);
return new NamespaceManager(uri, tP);
}
调用AcceptMessageSession时,队列中是否已经有消息?如果没有,我理解这是意料之中的行为。AcceptMessageSession将等待第一条消息,从中获取SessionId以初始化会话。如果您提前知道会话id,可以尝试调用AcceptMessageSession的重载版本,在其中可以指定会话id和超时。这些可能不会阻止,但我不能百分之百确定。
也许与最初的问题没有100%的关系,但如果有任何可怜的人最终在这里搜索AcceptMessageSession在会话为空时超时的原因,那么如果打开了预取,也可能发生这种情况,即设置为非零值。