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>
Итак, довольно просто:
- На счастливом пути, использовать из очереди
input
в AMQ, десериализовать его (через XStream)в объект Java, отправьте его в thingProcessor
и поместите результат этого процессора в очередь output
. - Если произойдет исключение, скажем, что
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>
)а также?
Заранее спасибо!