我有2个问题,我未能找到任何解决方案。
-
在Azure Service Bus队列中是否有任何内置的方式,我只能在会话处理程序中的一个会话(对于该会话(中接收消息。
-
也有什么办法我只能仅从该会话的无生气队列中收到消息。
我可以在我的代码中以编程方式执行此操作,但是如果我的代码中其他逻辑,我不想编写。
在Azure Service Bus队列中是否有任何内置的方式,我只能从我的会话处理程序中的一个会话(该会话ID(接收消息。
正如肖恩·费尔德曼(Sean Feldman(提到的队列客户端的。
如果要使用QueueClient.AcceptMessageSessionAsync(sessionID)
接收队列消息,我们需要使用RequiresSession
true ,
var description = new QueueDescription(QueueName)
{
RequiresSession = true
};
namespaceManager.CreateQueue(description);
也有什么方法我只能仅从该会话中的无生语队列中接收消息。
基于我的测试,我们无法通过以下代码从死语队列中获取死语队列消息
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();
无法为子标题创建消息。TrackingID:06A39820-7BF6-412D-AB31-80EF5C174A12_G20_B31,SystemTracker:Tomsbservice:tomsbservice:Queueue:queuename | $ deadletterterqueue
我的解决方法是,我们可以获取死去的队列消息并提交给队列或其他普通队列。
我认为您无法为服务总线队列做到这一点。您可以通过服务总线主题和过滤的订阅来归结一些类似的东西。
因此,您将消息发送到一个主题,然后您必须创建一个与此类似的每个会话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();
消息会话功能是专门为此设计的。
QueueClient.AcceptMessageSessionAsync(sessionID)
允许为正常队列实现这一目标。至于DLQ-不确定是否有效。