对于我的Service Bus实现,我需要对超过一定大小的消息进行分段,然后在收到所有片段后重新组合它们。
使用竞争队列客户端(例如,多个工作者角色实例)时,使用会话确保同一实例接收具有匹配会话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);
}
答案 0 :(得分:1)
调用AcceptMessageSession时队列中是否已有消息?如果没有,我理解这是预期的行为。 AcceptMessageSession将等到第一条消息,它将从中获取SessionId以初始化会话。如果您事先知道会话ID,则可以尝试调用AcceptMessageSession的重载版本,您可以在其中指定会话ID和超时。那些可能不会阻止,但我不是100%肯定。