Java Spring批处理事务异常:在JobRepository中检测到现有事务
我正在尝试此操作,但遇到异常: java.lang.IllegalStateException:在JobRepository中检测到现有事务。请修复此问题并重试(例如,从客户端删除@Transactional注释) 有没有人遇到过这个问题Java Spring批处理事务异常:在JobRepository中检测到现有事务,java,spring,transactions,spring-batch,Java,Spring,Transactions,Spring Batch,我正在尝试此操作,但遇到异常: java.lang.IllegalStateException:在JobRepository中检测到现有事务。请修复此问题并重试(例如,从客户端删除@Transactional注释) 有没有人遇到过这个问题 @Transactional(propagation = Propagation.REQUIRED) public void method1() // this method must be 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);
}
尝试从
method2()中删除@Transactional(propagation=propagation.NOT_SUPPORTED)
,
我这样解决了这个问题:
- 专门创建一个新bean来启动批处理作业李>
- 在该bean上添加@Transaction(propagation=propagation.NOT_SUPPORTED)
- 为spring批处理配置任务执行器。比如:
<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>
Application-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执行的任何DB更新都将被还原。因此,我建议您在单独的线程中执行作业。更简单。清洁剂。不幸的是,它不起作用。抛出相同的异常B有自己的事务管理,因此避免@Transactional注释。您是否尝试过删除所有事务性批注?当我删除所有@transactional批注时,它可以正常工作。但对于相同的流程,我需要在“method1”上使用@Transactional(propagation=propagation.REQUIRED)。@Transactional(propagation=propagation.REQUIRED)是否有其他选择?从
method1()调用batchService.runJobWithId(123L)
,这是正确的答案。简而言之,使用@Transactional
是Spring批处理作业中的一个禁忌,因为框架本身提供了事务管理。