【问题标题】:Receive only the last message on topics仅接收有关主题的最后一条消息
【发布时间】:2016-09-23 16:23:02
【问题描述】:

我有一个订阅了 Azure Servicebus 主题的应用程序,该应用程序不断接收来自流分析的消息。但是这个应用程序并不是每次都订阅这个主题。应用订阅时,如何只收到来自主题的最后一条消息

【问题讨论】:

  • 消息总是作为 FIFO 处理。您的主题是否有多个订阅? “但是这个应用程序并不是每次都订阅这个主题”是什么意思?
  • 听起来您的案例并未完全映射到 ASB,并且可能需要一些自定义代码。就像@Thomas 说的,你能详细说明一下你的应用吗?
  • @Thomas 我有一个订阅应用程序,它有时会离线,当它上线时只需要接收最新消息,而不是 FIFO 的整个队列
  • 那么你想对其他消息做什么?您需要先清除队列(最后一条消息除外)。

标签: azure azureservicebus azure-servicebus-topics


【解决方案1】:

根据您的问题和您的 cmets,我可以为您提供以下建议:

  • 当您的应用程序启动时,连接到 Azure ServiceBus 订阅并获取队列中的所有消息。
  • 删除所有以前的消息(只需完成它)并处理最后一条消息。
  • 然后您就可以开始收听新的传入消息了。

基于此答案 (Clearing azure service bus queue in one go):

// Get the message receiver
var messagingFactory = MessagingFactory.CreateFromConnectionString("ServiceBusConnectionString");
var messageReceiver = messagingFactory.CreateMessageReceiver(SubscriptionClient.FormatSubscriptionPath("TopicName", "SubscriptionName"));

BrokeredMessage lastMessage = null;
while (messageReceiver.Peek() != null)
{
    if(lastMessage != null)
    {
        // This was not the last message so complete it.
        lastMessage.Complete();
    }

    // Batch the receive operation
    var brokeredMessages = messageReceiver.ReceiveBatch(300).ToList();

    //Get the last message and remove it from the list
    lastMessage = brokeredMessages.Last();
    brokeredMessages.RemoveAt(brokeredMessages.Count -1);

    // Complete all the other messages
    var completeTasks = brokeredMessages.Select(m => Task.Run(() => m.Complete())).ToArray();

    // Wait for the tasks to complete. 
    Task.WaitAll(completeTasks);                
}

if (lastMessage != null)
{
    // Process your message 
}

// Start listening to new incoming message
messageReceiver.OnMessage(message =>
{
    // Process new messages
}, new OnMessageOptions());

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2018-04-20
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多