Перейдем к одной из самых серьезных задач, без которой не может обойтись ни одна серьезная интеграционная платформа, к XA транзакциям. Для примера возьмем ситуацию близкую к реальности описанную как маршрут Apache Camel.
<camelContext xmlns="http://camel.apache.org/schema/spring">
<!-- Transactional route -->
<route>
<from uri="jmstx:queue:giro" />
<to uri="jmstx:queue:statusLog" />
<bean ref="accountService" method="credit" />
<bean ref="accountService" method="debit" />
</route>
<!-- Feeder route -->
<route>
<from uri="jmstx:queue:statusLog" />
<to uri="file:Success" />
</route>
</camelContext>
В этом маршруте описывается следующее:
- Принимает сообщение из JMS-очереди giro
- Перенаправляет сообщение в JMS-очередь statusLog, в которой должны быть только успешные сообщения
- Меняем состояние базы данных
- Принимает сообщение из JMS-очереди statusLog
- Сохраняет сообщение в папке Success