Как сохранить только одну транзакцию на выполнение задания? - PullRequest
0 голосов
/ 13 декабря 2018

Моя spring-batch конфигурация содержит задание с несколькими шагами.На одном этапе я читаю сообщения из очереди JMS, а на другом этапе я записываю данные в базу данных. Я бы хотел, чтобы все задание выполнялось в одной и той же JTA транзакции

Проблемы

  1. Когда я выполняю ридер @Transactional, job фиксирует транзакцию после того, как ридер получает все сообщения из очереди JMS, а затем job начинает новую транзакцию для писателя .Это не позволяет мне сохранять одну транзакцию на выполнение задания;
  2. Когда я запускаю средство запуска задания @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.

...