我正在尝试这个并获得异常: 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);
}
答案 0 :(得分:1)
尝试从@Transactional(propagation = Propagation.NOT_SUPPORTED)
method2()
答案 1 :(得分:0)
我解决了这个问题:
弹簧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执行的任何数据库更新。所以,我建议你在一个单独的线程中执行你的工作。简单。清洁器。