Моя spring-batch
конфигурация содержит задание с несколькими шагами.На одном этапе я читаю сообщения из очереди JMS
, а на другом этапе я записываю данные в базу данных. Я бы хотел, чтобы все задание выполнялось в одной и той же JTA
транзакции
Проблемы
- Когда я выполняю ридер
@Transactional
, job
фиксирует транзакцию после того, как ридер получает все сообщения из очереди JMS
, а затем job
начинает новую транзакцию для писателя .Это не позволяет мне сохранять одну транзакцию на выполнение задания; - Когда я запускаю средство запуска задания
@Transactional
, выполнение задания завершается неудачно с
java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).
Очевидно, JobRepositoryFactoryBean
класс добавляет дополнительного советника , чтобы проверить, существует ли активная транзакция, и если да, то adviser
выдает исключение.
Как я могу выполнить требование?Моя единственная оставшаяся идея состоит в том, чтобы прибегнуть к некоторому подходу AOP
к конфигурированию (например, добавить интептер в AbstractJob # execute ).
Я использую Atomikos
для управления JTA
транзакции.JobRepository
имеет собственный экземпляр DataSourceTransactionManager
со своим собственным DataSource
.