То, что вы видите, - это ожидаемое поведение. Если вы используете redelivery-delay
> 0, то заказ на доставку будет прерван. Если вы используете redelivery-delay
из 0
, то заказ на доставку не будет нарушен. Поэтому, если вы хотите поддерживать строгий порядок, используйте redelivery-delay
из 0
.
Если посредник заблокировал доставку всех других сообщений в очередь во время задержки повторной доставки, которая полностью повредит производительности пропускной способности сообщения. Что если задержка повторной доставки составила 60 секунд или 10 минут? Очередь будет заблокирована все это время. Это не подходит для корпоративного брокера сообщений, обслуживающего сотни или, возможно, тысячи клиентов, каждый из которых может регулярно инициировать доставку в общих очередях. Это поведение не настраивается.
Если вам абсолютно необходимо поддерживать порядок сообщений даже для сообщений, которые не могут быть немедленно использованы, и redelivery-delay
из 0
вызывает слишком быстрые повторные доставки, тогда я вижу несколько возможных вариантов ( без определенного порядка):
- Настройте адрес недоставленной буквы и установите
max-delivery-attempts
на подходящее значение, чтобы после нескольких повторных доставок сообщение о проблемах c могло быть очищено из очереди. - Реализуйте собственную задержку в своем клиенте. Это может быть так же просто, как перехват любого исключения и использование
Thread.sleep()
перед вызовом ctx.rollback()
.