Azure 服务总线:AcceptMessageSession 超时

Azure Service Bus: AcceptMessageSession times out

对于我的服务总线实现,我需要对超过特定大小的消息进行分段,然后在收到所有分段后重新组合它们。

当使用竞争队列客户端(例如多个工作者角色实例)时,使用会话来确保同一实例接收具有匹配会话 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% 确定。

可能与原始问题不是 100% 相关,但如果有任何可怜的灵魂最终在这里寻找为什么 AcceptMessageSession 在会话为空时超时 - 如果您打开预取,也可能发生这种情况,即设置为非零值。