首页 文章

Azure Servicebus:从队列的一个会话ID接收所有消息

提问于
浏览
0

我有2个问题,我没有找到任何解决方案 .

  • 在azure服务总线队列中是否有任何内置方式,我只能在会话处理程序中从一个会话(对于该sessionId)接收消息 .

  • 还有什么方法我只能从该会话的deadlettered队列中接收消息 .

我可以在我的代码中以编程方式执行此操作,但我不想在代码中编写if else逻辑 .

3 回答

  • 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();
    
  • 0

    消息会话功能专门为此而设计 .

    QueueClient.AcceptMessageSessionAsync(sessionID)允许实现正常队列 . 至于DLQ - 不确定是否有效 .

  • 0

    在azure服务总线队列中是否有任何内置方式,我只能在会话处理程序中从一个会话(对于该sessionId)接收消息 .

    正如肖恩·费尔德曼提到的QueueClient.AcceptMessageSessionAsync(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

    我的解决方法是我们可以获取死信队列消息并提交到队列或其他正常队列 .

相关问题