首页 > 解决方案 > 如何在每个作业执行中只保留一个事务?

问题描述

我的spring-batch配置包含一个包含多个步骤的作业。在一个步骤中,我从JMS队列中读取消息,在另一个步骤中,我将数据写入数据库。我希望整个工作在同一个JTA事务中执行

问题

  1. 当我创建阅读器 @Transactional时,阅读器在接收到队列中的所有消息job后提交事务,然后为编写启动一个新事务。它不允许我在每个作业执行中保留单个事务;JMSjob
  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抛出异常。

我怎样才能满足要求?我剩下的唯一想法是采用某种配置方法(例如,在AbstractJob#executeAOP上添加一个拦截器)。

Atomikos用来管理JTA交易。JobRepository有自己的DataSourceTransactionManager实例和自己的DataSource.

标签: springspring-batchspring-transactions

解决方案


推荐阅读