#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:
Вы не можете отправить совершенно новое сообщение непосредственно в очередь с мертвыми письмами. Очередь мертвых писем предназначена для хранения сообщений, которые не могут быть обработаны из родительской очереди/подписки. Поэтому сначала необходимо найти сообщение в родительской очереди, чтобы оно попало в очередь с мертвыми буквами.