2013-12-04 5 views
7

Я пишу кусок кода, который позволит нам:Как удалить сообщение DeadLetter на Azure Service Bus Тема

  1. Посмотреть список всех мертвых буквенных сообщений, которые существуют в пределах Azure Service Автобусная тема (Peek)
  2. Исправить и отправить их обратно в тему
  3. Удалите их из очереди мертвой буквы при повторной отправке.

У меня нет проблем с первыми 2 очками; используя режим приема Peek, я могу показать список сообщений, и мы можем редактировать и повторно отправлять без проблем.

Проблема возникает, когда я хочу фактически удалить сообщение из очереди с мертвой буквой.

Как это сделать при сообщении по уровню сообщений? Мы можем удалить только два сообщения, находящиеся в очереди с мертвой буквой, и оставить остальных для просмотра на более позднем этапе. Вызывает ли вызов .Complete() сообщение в очереди с мертвой буквой, как это делается в главной подписке?

Для справки; вот наш код для получения SubscriptionClient для очереди мертвой буквы:

private SubscriptionClient GetOrCreateSubscriptionClient(string connectionString) 
{ 
    if (!NamespaceManager.TopicExists(_topicName)) 
    { 
     NamespaceManager.CreateTopic(new TopicDescription(_topicName) 
     { 
      MaxSizeInMegabytes = 5120, 
      DefaultMessageTimeToLive = TimeSpan.FromSeconds(DEFAULT_LOCK_DURATION_IN_SECONDS) 
     }); 
    } 

    if (!NamespaceManager.SubscriptionExists(_topicName, _subscriptionName)) 
    { 
     NamespaceManager.CreateSubscription(_topicName, _subscriptionName); 
    } 

    var deadLetterPath = SubscriptionClient.FormatDeadLetterPath(_topicName, _subscriptionName); 

    var client = SubscriptionClient.CreateFromConnectionString(
     connectionString, deadLetterPath, _subscriptionName, ReceiveMode.PeekLock); 

    return client; 

} 

ответ

7

Да, вызывая полное по ссылке на посредничестве сообщения, которое вы получаете от очереди мертвой буквы удалит его из очереди мертвой буквы.

0

Вот как вы можете получить список всех сообщений в мертвой очереди буквы:

public async Task<IEnumerable<BrokeredMessage>> GetDeadLetterMessagesAsync(string connectionString, 
    string queueName) 
{ 
    var queue = QueueClient.CreateFromConnectionString(connectionString, QueueClient.FormatDeadLetterPath(queueName)); 
    var messageList = new List<BrokeredMessage>(); 
    BrokeredMessage message; 
    do 
    { 
     message = await queue.PeekAsync(); 
     if (message != null) 
     { 
      messageList.Add(message); 
     } 
    } while (message != null); 
    return messageList; 
} 

Используя SequenceNumber, то вы можете удалить конкретное сообщение:

public async Task DeleteDeadLetterMessageAsync(string connectionString, string queueName, long sequenceNumber) 
{ 
    var deadLetterQueue = QueueClient.CreateFromConnectionString(connectionString, QueueClient.FormatDeadLetterPath(queueName)); 
    var msg = await deadLetterQueue.PeekAsync(sequenceNumber); 
    if (msg.SequenceNumber == sequenceNumber) 
    { 
     msg = await deadLetterQueue.ReceiveAsync(); 
     await msg.CompleteAsync(); 
    } 
} 

Пожалуйста, обратите внимание, что Peek может возвращать другое сообщение, если нет сообщения с указанным SequenceNumber. Поэтому вам нужно проверить SequenceNumber, чтобы вы не удалили неправильное сообщение.

Смежные вопросы