Очень хорошие вопросы, чтобы поговорить об обработке транзакций Camel.
Общее замечание: когда речь идет о транзакциях Camel, это означает потребление транзакций из системы с поддержкой транзакций , такой как база данных или JMS-брокер. Оператор transacted
в маршруте должен следовать сразу за оператором from
, поскольку он всегда связан с потреблением .
Aa. Транзакция выполняется в (A.2) действительно требуется здесь?
Нет, это не так. Поскольку файловая система не поддерживает транзакции , она не может помочь в этом маршруте.
Ab Если ответом на #a является "да", то ...?
Нет "менеджера транзакций файловой системы"
A . c. Так как DEST_QUEUE находится на стороне производителя, то нужно ли выполнять транзакции с компонентом JMS в (A.5)?
Не уверен, но я так не думаю. Производитель пытается передать сообщение брокеру. Транзакции используются для включения отката , но если посредник не получил данные, что может сделать откат?
Ba Компонент JMS в (B.1) помечен как транзакционный, поэтому в этом случае необходимо ли выполнять маршрут, как указано в (В.2)?
Это зависит , поскольку SR C и DEST находятся на разных брокерах .
- Если вы хотите сквозную транзакцию между брокерами, вам нужно использовать менеджер XA-транзакций, а затем вы должны пометить маршрут как
transacted
. - Если вы в порядке с потребительской транзакцией , вы можете настроить для него компонент JMS и опустить диспетчер Spring Tx и оператор Camel
transacted
.
Чтобы прояснить последний момент: если вы используете транзакцию с локальным брокером, Camel не фиксирует сообщение, пока маршрут не будет успешно обработан . Поэтому, если произойдет какая-либо ошибка, произойдет откат, и сообщение будет доставлено.
В большинстве случаев это совершенно нормально, однако, что еще может произойти с двумя разными брокерами, это то, что маршрут успешно обработан, сообщение доставлено брокеру DEST, но Camel больше не может коммитить против SR C брокер. Затем происходит повторная доставка, маршрут обрабатывается еще раз, и сообщение доставляется несколько раз брокеру DEST .
По моему мнению, сложность транзакций XA сложнее, чем очень редкие крайние случаи с транзакциями локальных брокеров. Но это очень субъективное мнение и, возможно, также зависит от контекста или данных, с которыми вы работаете.
И важно отметить: , если SR C и DEST-брокер совпадают, транзакции локального брокера на 100%! Абсолютно нет необходимости в Spring Tx manager и Camel transacted
.
Bb Поскольку DEST_QUEUE находится на стороне производителя, то же самое нужно для компонента JMS в (B.4) быть сделанным?
То же, что и ответ Ba