从服务总线队列接收消息时出现问题

Posted

技术标签:

【中文标题】从服务总线队列接收消息时出现问题【英文标题】:Issue while receiving a message from service bus queue 【发布时间】:2022-01-09 04:47:40 【问题描述】:

我有一个分区的服务总线队列,根据我在队列中接收消息的会话 ID。但我得到以下expcetion,

无法接受请求的会话“343747143130383837004500”。它可能被另一个接收器锁定。 TrackingID:429FAE51-488B-4365-B0AA-06127A47B428_B2,SystemServiceBus:MaxeServiceBus:队列:Maxeemessages〜255,时间戳:2021-11-10T06:19:54 TrackingID:1FFB82129F4A44D9A03C2F3A812606E5_G27,SystemTracker:Gateway7,Timestamp:2021-11-10T06:19 :54(SessionCannotBeLocked)内容:3437471431303838370045000000000001

请帮助我解决这个问题。

谢谢

【问题讨论】:

您能否添加更多有关配置或任何代码的详细信息? 【参考方案1】:

当消息在接收时无法获取会话锁定时会出现此问题。并且在尝试接受具有特定会话 ID 的会话时,但它当前已被其他客户端锁定。

解决方案:根据错误消息,检查其他客户端并确保会话已被他们解锁。

以下是一些应该考虑的事情:

通常由客户端或任何应用程序发送到队列的消息可以通过将会话 id 属性设置为任何值来创建会话。

可以通过在创建队列时选中该框从 Azure 门户创建启用会话的实体。 https://docs.microsoft.com/en-us/azure/service-bus-messaging/media/message-sessions/subscription-sessions.png

可以通过将“RequireSession”属性设置为 true,使用 .Net 客户端中的 WindowsAzure.ServiceBus 库来创建启用会话的 Azure 服务总线队列。下面是示例代码:

  QueueDescription _azureQueue = new QueueDescription("session-enabled-queue")
   
          RequiresSession = true
    ;

  NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(“connectionString”);

  var queue = await namespaceManager.CreateQueueAsync(_azureQueue);

以下是从启用会话的服务总线实体接收消息的示例代码:

  MessagingFactory messagingFactory = MessagingFactory.CreateFromConnectionString(“connectionString”);
  var queueClient = messagingFactory.CreateQueueClient(“queueName”);
  var sessionClient = await queueClient.AcceptMessageSessionAsync(“sessionId”);
  BrokeredMessage _message = await sessionClient.ReceiveAsync();
  await sessionClient.CloseAsync();

使用 AcceptMessageSessionAsync() 接收消息而不设置“SessionId”将接收队列或主题订阅中的第一条消息,并将使用该消息的 SessionId 初始化会话接收器。

要将事务性消息发送到启用会话的队列或主题,该消息必须设置“SessionId”属性。如果还指定了“PartitionKey”属性,则它必须与“SessionId”属性相同。如果“Partitionkey”和“SessionId”都不同,则证明是无效操作异常。

【讨论】:

以上是关于从服务总线队列接收消息时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 web api 中接收服务总线消息队列/主题

限制服务总线消息接收的 Azure Functions 速率

尝试发送 100 MB 批处理时出现 Azure 服务总线错误

Azure 服务总线 - 留言

Azure 服务总线队列以并行方式异步处理消息

从死信队列重新提交消息 - Azure 服务总线