Как удалить сообщение DeadLetter в теме служебной шины Azure

Я пишу фрагмент кода, который позволит нам:

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

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

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

Как это сделать на уровне сообщения? Мы можем удалить только 2 сообщения, находящихся в очереди недоставленных сообщений, а остальные оставить для проверки на более позднем этапе. Удаляет ли вызов .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;

}

person Luke Merrett    schedule 04.12.2013    source источник


Ответы (2)


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

person MikeWo    schedule 04.12.2013

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

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, чтобы не удалить неправильное сообщение.

person pberggreen    schedule 07.09.2017