代码注册了一个会话处理程序,但是在配置了{SupportOrdering = true}(又称强制排序)的主题中,分配了SessionId的消息只是位于主题中而未被传递。但是,如果注册了常规处理程序,它们确实可以提供!
主题是使用“强制排序”创建的:
using Microsoft.Azure.Management.ServiceBus;
using Microsoft.Azure.Management.ServiceBus.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
var topicParams = new SBTopic
{
EnablePartitioning = true,
SupportOrdering = true
};
sbMgmtClient.Topics.CreateOrUpdateAsync(resourceGroupName, namespaceName, TopicName, topicParams);
订阅客户端注册SessionMessageHandler:
private void Register()
{
_subscriptionClient = new SubscriptionClient(_serviceBusConnection, _topicName, _subscriptionName, ReceiveMode.PeekLock, retryPolicy);
var sessionHandlerOptions = new Microsoft.Azure.ServiceBus.SessionHandlerOptions(MessageExceptionhandler) { AutoComplete = false, MaxConcurrentSessions = 1 };
_subscriptionClient.RegisterSessionHandler(MessageHandler, sessionHandlerOptions);
}
private async Task MessageHandler(IMessageSession session, Message msg, CancellationToken cancelToken)
{
Console.WriteLine(msg.MessageId + " " + msg.SessionId);
await session.CompleteAsync(msg.SystemProperties.LockToken);
}
消息永远不会传递,他们坐在主题订阅未送达。 DeliveryCount为'1',他们不会去DeadLetter。
但是,如果我注册一个常规的MessageHandler,那么这些消息会传递,而且它们似乎也按顺序传递。消息传递中的以下结果:
private void Register()
{
var messageHandleroptions = new MessageHandlerOptions(MessageExceptionhandler) { AutoComplete = false, MaxConcurrentCalls = 1 };
_subscriptionClient.RegisterMessageHandler(MessageHandler, messageHandleroptions);
}
private async Task MessageHandler(Message msg, CancellationToken cancelToken)
{
Console.WriteLine(msg.MessageId + " " + msg.SessionId);
await _subscriptionClient.CompleteAsync(msg.SystemProperties.LockToken);
}
我找不到任何使用.Net Core 2.0使用强制消息排序会话的SubscriptionClient示例,所以作为这个问题的必然结果,是否有任何抽样样本?
我运行了你的代码,它工作正常 - 我能够发送会话消息并接收它。它根本不需要代码更改。然而,细节很小 - 您在创建订阅时是否启用了会话?
以下是Azure Portal中的外观:
当我创建这样的订阅时,我能够接收会话消息。在不支持会话的订阅中,您将无法接收这些消息。
注意:您需要在Azure门户中创建订阅,因为.Net Core Service Bus nuget包不支持创建实体。您可以在我的博客文章中了解更多相关信息:http://www.michalbialecki.com/2018/02/28/receiving-messages-azure-service-bus-net-core/