Настройка Java / Camel / AMQ с DLQ для конкретного маршрута - PullRequest
0 голосов
/ 26 сентября 2018

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>

Но я надеюсь на что-то более элегантное, чем это ...

Есть идеи, как мне это сделать?

1 Ответ

0 голосов
/ 27 сентября 2018

Может быть, так будет лучше для вас:

             DeadLetterChannelBuilder errorHandlerBuilder = deadLetterChannel("jms:dummy");
    errorHandlerBuilder.onPrepareFailure(exchange -> {
        exchange.getIn().setHeader("CamelJmsDestinationName",exchange.getIn().getHeader("JMSDestination",String.class).concat(".DLQ"));
    });

    from("jms:input1")
            .to("seda:process");

    from("jms:input2")
            .to("seda:process");

    from("jms:input3")
            .to("seda:process");

    from("seda:process").errorHandler(errorHandlerBuilder)
            .process(exchange -> {
                throw new RuntimeException();
            });

Вы можете вычислить имя очереди DLQ во время выполнения.DeadLetterChannelBuilder может быть настроен так же, как ваше onException.

...