Spring Batch Transaction Exception:在JobRepository中检测到现有事务

时间:2014-11-11 10:19:16

标签: java spring transactions spring-batch

我正在尝试这个并获得异常:  java.lang.IllegalStateException:在JobRepository中检测到的现有事务。请修复此问题并重试(例如,从客户端删除@Transactional注释)。

有没有人遇到过这个问题?

   @Transactional(propagation = Propagation.REQUIRED)
public void method1() // this method must be Transactional 
{

    ...    /*code to call JMS services*/

  method2();
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method2()
{
  batchService.runJobWithId(123L);
}

2 个答案:

答案 0 :(得分:1)

尝试从@Transactional(propagation = Propagation.NOT_SUPPORTED)

中删除method2()

答案 1 :(得分:0)

我解决了这个问题:

  • 专门创建一个新bean以启动批处理作业。
  • 在该bean上添加@Transaction(propagation = Propagation.NOT_SUPPORTED)。
  • 为spring批处理配置任务执行程序。类似的东西:

弹簧batch.xml:

<beans:bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <beans:property name="jobRepository" ref="jobRepository" />
    <beans:property name="taskExecutor" ref="taskExecutor" />
</beans:bean>

应用程序的context.xml

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="50" />
    <property name="queueCapacity" value="10" />
    <property name="keepAliveSeconds" value="120" />
</bean>

任务执行者的诀窍是什么?如果检查日志,spring批处理会抱怨,因为没有定义任务执行程序,它将恢复为同步任务执行,这是在同一个线程上。使用上面的配置作业将在不同的线程上启动。

重要提示 尽管我没有配置taskExecutor我管理了一段时间,但是当我添加一个JobListener来更新我自己的表时,我遇到了工作的开始和结束时间。返回StartJob()调用时,将恢复jobListener执行的任何数据库更新。所以,我建议你在一个单独的线程中执行你的工作。简单。清洁器。