从服务总线队列接收消息时出现问题
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”都不同,则证明是无效操作异常。
【讨论】:
以上是关于从服务总线队列接收消息时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
限制服务总线消息接收的 Azure Functions 速率