Можете ли вы Отправить новое сообщение Непосредственно в очередь мертвых писем в служебной шине Azure?

#azureservicebus

Вопрос:

Недавно я написал код, который обрабатывает сообщения очереди с мертвыми письмами из служебной шины azure в отчет.

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

Я собрал приложение c# linqpad / консоль, которое считывает папку с текстовыми файлами и пытается отправить каждый из них в виде сообщения в мои тупиковые запросы testqueue/$с помощью Azure.Обмен сообщениями.Клиентская библиотека ServiceBus, которая выглядит следующим образом:

 var files = Directory.GetFiles(messagePath,filePattern); var client = new ServiceBusClient(connectionString); var dlqSender = client.CreateSender($"{queueName}/$deadletterqueue");  foreach (var file in files) {  var msgBody = File.ReadAllText(file);  var message = new ServiceBusMessage(msgBody);  await dlqSender.SendMessageAsync(message); }   

К сожалению, это просто зависает на dlqSender.Строка SendMessageAsync для 1-го сообщения и никогда не возобновляется. Нет сообщения об ошибке, и ничто не попадает в DLQ или очередь.

Я ценю, что это может быть странный сценарий использования, но я думал, что DLQ вел себя как любая другая очередь. Было бы хорошо получить некоторое подтверждение того, что это поддерживается.

Ответ №1:

Существует несколько способов, с помощью которых вы можете вручную публиковать сообщения в очередях мертвых писем в служебной шине Azure.

  • Вы можете использовать DeadLetterAsync() метод, который отправляет сообщение в очередь мертвых писем.
  • Вы можете определить очень меньшее TimeToLive значение (ноль, если сможете) для очереди, которая подписывается на эти сообщения, что приведет к тому, что сообщения сразу попадут в очередь с мертвыми буквами, как только истечет срок действия TTL. (Примечание: EnableDeadLetteringOnMessageExpiration true Для этого свойство должно быть установлено в значение)

Здесь следует отметить, что вы можете не сразу увидеть сообщения в очереди с мертвыми буквами после их публикации, поскольку сообщения с мертвыми буквами обрабатываются механизмом асинхронной сборки мусора Microsoft по умолчанию.Лазурь.Пакет ServiceBus, поэтому вам нужно некоторое время подождать, пока GC выполнит свою работу, и тогда вы сможете видеть свои сообщения в очереди мертвых писем.

Комментарии:

1. Я не смог найти DeadLetterAsync() ни в одном из классов отправки — это метод получателя, не так ли?

2. Я просто попробовал подход «время жить» — разместил в основной очереди не DLQ. Через короткое время сообщение было удалено. Должна быть включена функция ввода — вывода на экране-где задано это свойство? Его нет в сообщении или отправителе?

3. DeadLetterAsync() Метод будет вызван для объекта сообщения, а EnableDeadLetteringOnMessageExpiration свойство будет установлено в очереди, получающей сообщение.

4. Хорошо, спасибо, перенастройка очередей для меня не сработает. На данный момент я собираюсь опубликовать основную очередь, а затем запустить сценарий получателя, чтобы отправить их всех в тупик. Надеюсь, кто — нибудь опубликует пример публикации непосредственно в dlq.

Ответ №2:

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