我有两个问题,我没有找到任何解决方案。
在azure服务总线队列中是否有任何内置方式,我只能从会话处理程序中的一个会话(针对该sessionId)接收消息。
还有什么方法我只能从该会话的破坏队列中接收消息。
我可以在我的代码中以编程方式执行此操作,但我不想在代码中编写if else逻辑。
答案 0 :(得分:0)
我认为你无法为Service Bus队列做到这一点。您可以使用Service Bus主题和过滤订阅来实现类似的功能。
因此,您将邮件发送到某个主题,然后您必须为每个会话ID创建一个类似于此的订阅:
var filter = new SqlFilter(@"sys.SessionId = \"SESSIONID\"");
namespaceManager.CreateSubscription("YOUR_TOPIC", "SESSIONID_SUBSCRIPTION", filter);
然后只接收来自此订阅的消息:
var client = new SubscriptionClient("...", "YOUR_TOPIC", "SESSIONID_SUBSCRIPTION");
var message = client.Receive();
答案 1 :(得分:0)
消息会话功能专门为此设计。
QueueClient.AcceptMessageSessionAsync(sessionID)
允许为正常队列实现该目标。
至于DLQ - 不确定是否有效。
答案 2 :(得分:0)
在azure服务总线队列中是否有任何内置方式,我只能在会话处理程序中从一个会话(对于该sessionId)接收消息。
正如Sean Feldman提到的Queue Client。接受消息会话Async(sessionID)允许实现正常队列。
如果想要使用QueueClient.AcceptMessageSessionAsync(sessionID)
来接收队列消息,我们需要创建一个RequiresSession
true ,
var description = new QueueDescription(QueueName)
{
RequiresSession = true
};
namespaceManager.CreateQueue(description);
还有什么方法我只能从该会话的deadlettered队列中接收消息。
根据我的测试,我们无法使用以下代码
从deadletter队列中获取死信队列消息 var dlqName= QueueClient.FormatDeadLetterPath(queueName);
var dlqClient = QueueClient.CreateFromConnectionString(connectionstring, dfQueue);
var gid = Guid.NewGuid().ToString();
var messageSession = client.AcceptMessageSession(gid);
var receiveMessage = messageSession.Receive();
无法为子队列创建MessageSession。 TrackingId:06a39820-7bf6-412d-ab31-80ef5c174a12_G20_B31,SystemTracker:tomsbservice:队列:queuename | $ DeadLetterQueue
我的解决方法是我们可以获取死信队列消息并提交到队列或其他正常队列。