Я пытаюсь выяснить, могу ли я в любом случае повлиять на порядок обработки сообщений потребителя, когда сообщение откатывается в очередь.
У меня есть простой код ниже, который помогает мне воспроизвести проблему.
Я просто помещаю сообщения в очередь с разными JMSXGroupIds в определенном порядке:
- "A1" (JMSXGroupId: 1)
- "B1" (JMSXGroupId: 2)
- "A2" (JMSXGroupId: 1)
- "C1" (JMSXGroupId: 3)
- "B2" (JMSXGroupId: 2)
Код выполняет откат А1 (первоначально он повторяет сообщение 3 раза) и с задержкой возвращается в очередь. Однако потребитель затем ждет, пока он не сможет снова поднять А1 (после ожидания отсроченного времени), то есть группы B1 и С1 заблокированы за А1 и никогда не обрабатываются.
В идеале я надеялся, что, когда A1 вернется в очередь и получит команду ждать, потребитель получит B1 и C1 ... что я в конечном итоге пытаюсь сделать, это остановить одну JMSXGroup, блокирующую другие на потребителя. Кроме того, вероятно, стоит добавить, что мне нужно сохранить порядок последовательности сообщений для A (A1, A2, A3 ...) и надеялся сделать это, оставив их в очереди, вместо того, чтобы создавать какое-то решение для управления исключениями.
onException(Exception.class)
.log("Exception Caught !! ")
.redeliveryDelay("1000")
.maximumRedeliveries(3)
.handled(false)
.markRollbackOnly()
.log("log:output");
from("amq:queue:mailbox?concurrentConsumers=1")
.to(logEndpoint)
.process(exchange -> {
if(exchange.getIn().getBody(String.class).contains("A")) {
throw new Exception("Found A");
}
});
Я использую микросервис Apache Camel на основе Java с транзакционными маршрутами.
Ничего особенного, но я могу предоставить больше деталей / деталей конфигурации, если это необходимо.
Заранее спасибо