Java 8 / Camel 2.19.x / AMQ 5.15.x здесь.
У меня есть приложение на Java, которое использует Camel для получения сообщений из очередей AMQ, обработки этих сообщений и выполнения с ними всяких задач.Иногда выходные данные маршрута помещают результат обработки обратно в другую очередь для дальнейшей последующей обработки, но не всегда / обязательно.Типичная настройка Java / Camel / AMQ.
Каждый из моих маршрутов (я использую Camel XML DSL) имеет настроенный обработчик <onException>
, который обычно выглядит следующим образом:
<onException useOriginalMessage="true">
<exception>java.lang.Exception</exception>
<redeliveryPolicy logStackTrace="true"/>
<handled>
<constant>true</constant>
</handled>
<log message="${exception.stacktrace}" loggingLevel="ERROR"/>
<rollback markRollbackOnly="true"/>
</onException>
Очень просто: зарегистрируйте исключение и откат.
Я хотел бы в качестве части этого обработчика <onException>
поместить исходное сообщение (которое не удалось и вызвалосоздаваемое исключение, , а не исключение!) для конкретного маршрута DLQ (под "DLQ" я подразумеваю просто очередь, в которую могут быть отправлены сообщения о сбое для аудита / отчетности /цели воспроизведения)
То есть, если у моего приложения есть 30 маршрутов, каждый из которых использует 30 разных очередей AMQ, у меня будет 30 разных «DLQ», куда каждый из соответствующих обработчиков <onException>
будет отправлять сообщения о сбоях.
В идеале я хотел бы, чтобы эта конфигурация была на стороне AMQ (опять же, возможно, внутри activem.xml
или аналогичной), чтобы мне не нужно было вносить изменения в код или повторно развертывать, если нужно изменить адресаты DLQ,Но если это возможно сделать только изнутри маршрута / конфигов Camel, это тоже нормально.
I предположим Я мог бы изменить каждый маршрут, чтобы он содержал собственный настроенный целевой DLQ для исходных сообщений:
<onException useOriginalMessage="true">
<exception>java.lang.Exception</exception>
<redeliveryPolicy logStackTrace="true"/>
<handled>
<constant>true</constant>
</handled>
<log message="${exception.stacktrace}" loggingLevel="ERROR"/>
<rollback markRollbackOnly="true"/>
<to uri="activemq:fizzbuzz.dlq"/>
</onException>
Но я надеюсь на что-то более элегантное, чем это ...
Есть идеи, как мне это сделать?