Получение Apache Camel для условного внедрения заголовков на маршруте onException - PullRequest
0 голосов
/ 29 ноября 2018

Java 8 / Camel 2.19.x здесь.У меня есть следующий маршрут XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:spring="http://camel.apache.org/schema/spring"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.0.0.xsd"
>
    <routeContext id="myRoute" xmlns="http://camel.apache.org/schema/spring">

        <route id="doStuff">
            <from uri="activemq:input"/>

            <onException useOriginalMessage="true">
                <exception>java.lang.Exception</exception>
                <redeliveryPolicy logStackTrace="true"/>
                <handled>
                    <constant>true</constant>
                </handled>

                <log message="${exception.stacktrace}" loggingLevel="ERROR"/>

                <!-- we get the original XML message - convert it to an object -->
                <unmarshal ref="xstream"/>

                <wireTap uri="bean:errorProcessor" copy="true"/>

                <rollback markRollbackOnly="true"/>
            </onException>

            <transacted ref="shared"/>
            <doTry>
                <unmarshal ref="xstream"/>
                <to uri="bean:thingProcessor"/>
        <marshal ref="xstream"/>
                <to uri="activemq:output"/>
            </doTry>
        </route>
    </routeContext>
</beans>

Итак, довольно просто:

  1. На счастливом пути, использовать из очереди input в AMQ, десериализовать его (через XStream)в объект Java, отправьте его в thingProcessor и поместите результат этого процессора в очередь output.
  2. Если произойдет исключение, скажем, что thingProcessor выдает RuntimeException, мызарегистрируйте трассировку стека исключений в журналах приложения, затем мы конвертируем исходный XML (который мы использовали из очереди input), десериализовываем его в POJO и отправляем в errorProcessor для обработки.Наконец, мы выполняем откат транзакции JMS.

Будут случаи, когда заголовок CamelFilePath будет присутствовать в сообщении во время сбоя, и я хотел бы, чтобыerrorProcessor принять это и выполнить специальную логику, если заголовок присутствует.

В настоящее время мой errorProcessor выглядит следующим образом:

@Component("errorProcessor")
public class ErrorProcessor {

    private static final Logger log = LoggerFactory.getLogger(ErrorProcessor.class);

    private final ErrorHelper errorHelper;

    public ErrorProcessor(final ErrorHelper errorHelper) {
        this.errorHelper = errorHelper;
    }

    public void handleErrors(
            final Fizzbuzz fizzbuzz,
            @Header("CamelFilePath") final String camelFilePath,
            @ExchangeProperty(Exchange.EXCEPTION_CAUGHT) final Exception exception) {

        // If camelFilePath is non-null and non-empty, do stuff with it here.

    }
}

Выше fizzbuzz является оригиналом (десериализовано) XML / POJO, использованный из очереди input.

Мой вопрос

Иногда заголовок CamelFilePath будет присутствовать в сообщении / обмене, а иногда и не будет,Как я могу настроить свой маршрут так, чтобы , если он существовал на маршруте «счастливый путь», он был скопирован и представлен на маршруте «ошибки» (то есть из определения <onException>)а также?

Заранее спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете использовать выбор и простое предложение в вашем маршруте.
Я просто знаю, на Java Java, но для преобразования XML просто

.choice().when().simple("${header.CamelFilePath} != null && ${header.CamelFilePath} not contains ''").wireTap("bean:errorProcessor");


На XML это будет что-то вроде этого:

<choice>
 <when>
  <simple>
    ${header.CamelFilePath} != null &amp;&amp; ${header.CamelFilePath} not contains ''
  </simple>
  <wireTap uri="bean:errorProcessor" copy="true"/>
 </when>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...