Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring批处理事务异常:在JobRepository中检测到现有事务_Java_Spring_Transactions_Spring Batch - Fatal编程技术网

Java Spring批处理事务异常:在JobRepository中检测到现有事务

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 { ... /*

我正在尝试此操作,但遇到异常: 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);
}

尝试从
method2()中删除
@Transactional(propagation=propagation.NOT_SUPPORTED)

我这样解决了这个问题:

  • 专门创建一个新bean来启动批处理作业
  • 在该bean上添加@Transaction(propagation=propagation.NOT_SUPPORTED)
  • 为spring批处理配置任务执行器。比如:
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>

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批处理作业中的一个禁忌,因为框架本身提供了事务管理。