java - 已经在事务中时启动 spring batch 作业

标签 java spring transactions spring-batch

我有一个简单的 Spring 服务,它(在其他任务中)使用以下代码启动一个 spring 批处理作业:

@Autowired
private JobRegistry jobRegistry;

@Autowired
private JobLauncher jobLauncher;

public void startMyJob() {
    Job job = jobRegistry.getJob("myJobName");
    JobParameters jobParameters = new JobParametersBuilder().toJobParameters();
    jobLauncher.run(job, jobParameters);
}

只要在调用 Serivce-Method 时没有 Activity 事务,就可以正常工作。但是,对于活跃的事务,我得到这个异常:

Caused by: java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).

我无法轻易删除现有事务,因为它是由于某些我无法访问的框架代码而隐含的。

那么,在这种情况下,我怎样才能开始这份工作呢?新工作不应使用现有事务。它可以只开始自己的事务 - 但如何配置它以使其工作?

最佳答案

我遇到了类似的问题。特别是,我从一个用 @Transactional(propagation = Propagation.REQUIRES_NEW) 注释的类中开始我的工作。为了解决这个问题,我从一个没有活跃交易的地方开始我的工作。然后我如上所述遇到了你的问题 - 这是我解决它的方法:

在 JobRepository 上将 validateTransactionState 设置为 false - 它现在忽略了在我的 ItemProcessor 调用的类中自动创建的事务(因为该类使用 @Transcational 注释,如上所述)。

这让我的工作运行得很好。但是,我不确定我现在是否正在处理 2 个未结交易,并且想确定我不是。因此,我还删除了类级别的转换注解,并将其移至所有公共(public)方法,但由我的 Itemprocessor 调用的方法除外。因此我解决了这个问题。

关于java - 已经在事务中时启动 spring batch 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18125394/

相关文章:

.net - SQL中默认的最大事务超时是多少

oracle - PostgreSQL 与 Oracle 默认事务管理

java - 更新到 Hibernate 5 后无法访问 TransactionManager 或 UserTransaction

java - 如何使用Servlet和Ajax?

java - 如何将对象从 Spring 3.0 Controller 传递到 JSP View 并使用 JSTL 进行测试

java - 为什么gwt CellTable不显示所有结果?

java - 在不同的 Spring 上下文中加载属性

java - Spring - 删除验证错误?

java - Spring 无法注入(inject)实体管理器工厂

java - java 中的秒表