对于使用.Net Core 2.0 Library的Azure Service Bus,为什么SubscriptionClient.RegisterSessionHandler注册的处理程序没有收到消息?

问题描述 投票:0回答:1

代码注册了一个会话处理程序,但是在配置了{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示例,所以作为这个问题的必然结果,是否有任何抽样样本?

.net azureservicebus .net-core-2.0 azure-servicebus-topics
1个回答
0
投票

我运行了你的代码,它工作正常 - 我能够发送会话消息并接收它。它根本不需要代码更改。然而,细节很小 - 您在创建订阅时是否启用了会话?

以下是Azure Portal中的外观:

Creating a session enabled subscription

当我创建这样的订阅时,我能够接收会话消息。在不支持会话的订阅中,您将无法接收这些消息。

List of Azure Service Bus subscriptions

注意:您需要在Azure门户中创建订阅,因为.Net Core Service Bus nuget包不支持创建实体。您可以在我的博客文章中了解更多相关信息:http://www.michalbialecki.com/2018/02/28/receiving-messages-azure-service-bus-net-core/

© www.soinside.com 2019 - 2024. All rights reserved.