Jac*_*ack 4 java spring transactions spring-batch
我有一个简单的Spring-Service(除其他任务外)使用以下代码启动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);
}
Run Code Online (Sandbox Code Playgroud)
只要调用Serivce-Method时没有活动的事务,此方法就可以正常工作。但是,对于一个活跃的交易,我得到了这个异常:
Caused by: java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).
Run Code Online (Sandbox Code Playgroud)
我无法轻易删除现有事务,因为由于某些框架代码不在我的控制范围内而隐含了该事务。
那么,在这种情况下我该如何开始工作呢?新作业不应使用现有事务。它可以只是开始自己的事务-但是如何配置它以使其正常工作?
小智 6
我有一个类似的问题。特别是,我是从用注释的类中开始工作的@Transactional(propagation = Propagation.REQUIRES_NEW)。为了解决这个问题,我从没有活跃交易的地方开始工作。然后,我遇到了如上所述的您的问题-这是我解决的方法:
validateTransactionState在JobRepository上设置为false -现在它忽略了在我ItemProcessor调用的类中自动创建的事务(因为该类使用@Transcational进行了注释,如上所述)。
这使我的工作顺利进行。但是,我不确定我现在是否正在处理2个未结交易,并想确定自己没有。因此,我还删除了类级别上的事务注释,并将其移至所有公共方法中,但我的Itemprocessor调用的方法除外。因此,我解决了这个问题。
小智 5
我的解决方案是,启动作业的方法需要用@Transactional(propagation = Propagation.NOT_SUPPORTED)this进行注释,这将挂起当前事务并在执行后恢复。
transactionAttribute如果您需要与默认值不同的任何内容,您可以设置您的读者和作者。
我不需要setValidateTransactionState(false)在JobRepositoryFactoryBean或JobRepository
使用AbstractJobRepositoryFactoryBean.ValidateTransactionState,但要小心使用(警告:前方有龙)。
要使用另一个事务,您可以注入一个带有标记为 @Transactional() 的自定义SimpleJobLauncher.executor方法(或者创建一个自定义并对方法执行相同的操作)。Executor.runJobLauncherrun
我没有尝试过,因为我没有遇到过这个问题,但希望能有所帮助。
| 归档时间: |
|
| 查看次数: |
9005 次 |
| 最近记录: |