2016-09-23 3 views
0

У меня есть приложение, подписанное на Azure Servicebus Тема, которая постоянно получает сообщения от Stream Analytics. Но это приложение не каждый раз подписывается на это Тема. Как мне получить только последнее сообщение из темы, когда приложение подписывается?Получать только последнее сообщение на темы

+1

Сообщения всегда протекала в FIFO. У вас есть несколько подписки на вашу тему? Что вы подразумеваете под «Но это приложение не каждый раз подписывается на эту тему»? – Thomas

+0

Похоже, что у вас есть случай, который не является точным отображением в ASB, и может потребоваться некоторый код. Точно так же, как @Thomas сказал, не могли бы вы подробнее рассказать о своем приложении? –

+0

@Thomas У меня есть приложение для подписчиков, которое иногда находится в автономном режиме, когда он выходит в Интернет, нужно просто получить самое последнее сообщение, а не всю очередь FIFO –

ответ

0

Основываясь на ваш вопрос и ваши комментарии, это то, что я могу посоветовать вам:

  • При запуске приложение, подключиться к 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()); 
Смежные вопросы