Добрый день,
Это вариант вашего другого вопроса.
Конечная точка:
from("jms:queue:IN_QUEUE) //(A) Transactional Endpoint
передана, то есть вы пометили компонент JMS после выполнения транзакции, а JMS-сеансы будут управляться JmsTransactionManager.
.transacted("required") //(B) TX Policy with PROPAGATION_REQUIRED and
JPATxManager
Это должен быть не менеджер транзакций JPA, а менеджер транзакций JTA (например, Arjuna). Как и в вашем другом вопросе, теперь у вас есть локальная транзакция JMS для чтения вашего сообщения и локальные транзакции JPA для доступа к вашей БД. Вы хотите, чтобы PlatformTransactionManager (менеджер транзакций JTA) синхронизировал для вас локальные транзакции.
Что касается ваших вопросов:
Могут ли две разные транзакции быть присоединены к одному потоку (например, как указано выше) )?
Это действительно не имеет никакого смысла.
Если Да, какой из них должен быть приостановлен?
Ничто не будет приостановлено.
Каким должен быть порядок фиксации и отката вышеупомянутого маршрута?
Чтение БД не является транзакционным и не требует фиксации. Запись в файл на самом деле произойдет, когда транзакционный контекст JTA будет закрыт. Это оставляет БД записи. Если это не удастся, то чтение БД не имеет значения, сообщение будет возвращено в место назначения источника и запись файла не будет вызвана.
Включение ведения журнала DEBUG для различных менеджеров транзакций очень полезно.
Я мог бы go об этом с этой болезненной деталью. Это больше для бурки. Я думаю, что вы действительно оцените это. Очень тонко, и это часто случается.
from("jms:queue:SRC_QUEUE")
.transacted("required")
.to("jms1:queue:DEST_QUEUE")
Что произойдет, если две конечные точки помечены как транзакционные ... но ... у вас нет строки "транзакционная"? Хорошо, локальная транзакция JMS была запущена на приемнике сообщений. Это будет совершено по окончании маршрута. Существует две независимые локальные транзакции JMS. Они не синхронизируются менеджером транзакций JTA.
На самом деле происходит то, что вызывается коммит для сообщения 'get'. Для сообщения 'put' нет фактической фиксации. Сообщение «положить» фиксируется, когда сеанс JMS закрыт. Это в JMS spe c, которое закрывает соединение по своей природе и фиксирует любую транзакцию. Таким образом, поскольку между двумя компонентами нет никакой связи, «get» фиксируется, и затем сеанс «put» закрывается.
Это означает, что вы можете потерять сообщения, если происходит сбой между фиксацией для сообщения 'get' и закрытием сеанса для сообщения 'put'.
Имеет ли это смысл? Нет связи между локальными транзакциями, поэтому Camel закрывает их по порядку, начиная с фиксации get до вызова put.
Ключом является синхронизация транзакций JTA. У вас все еще есть ресурсы локальных транзакций (не XA), но ими можно очень хорошо управлять в довольно легком транзакционном контексте JTA.
from("jms:queue:SRC_QUEUE")
.transacted("required")
.to("DB:transactedwrite")
.to("jms1:queue:DEST_QUEUE")
Мне не удавалось найти правильный синтаксис для базы данных. вставить, но вы поняли. В этом случае вы можете получить дубликаты вставок в БД, если JMS 'put' завершится неудачно. Это не «все или ничего» транзакции XA. Сделки совершаются в порядке. Если кто-то посередине преуспевает, то следующая транзакция терпит неудачу, хорошо, 'get' будет откатываться, и вы будете получать дубликаты вплоть до точки сбоя.