【发布时间】:2020-05-04 04:15:59
【问题描述】:
我有一个 spring 批处理作业,它从 Web 服务读取数据,在处理器中进行一些丰富,然后保存到 DB。如果有人为同一组参数运行相同的作业两次,我想删除 db 中的旧数据,然后作为该作业的一部分重新写入。
我已经在 Step Method 之前的 StepExecutionListener 中编写了删除逻辑。
如何使我的步骤具有事务性,以便在作业中出现错误时回滚删除操作?
this.stepBuilderFactory.get("xStep")
.<Item,Item>chunk(1000)
.reader(xReader)
.processor(xProcessor)
.writer(xWriter)
.listener(xStepExecutionListenerForDelete)
.build()
【问题讨论】:
-
我不明白这怎么可能。根据设计,Spring Batch 防止运行相同的作业实例两次以完成。对于同一组作业参数,您最终应该得到相同的作业实例,所以我看不出如何两次运行同一个作业实例并擦除以前的数据。你的意思是之前的执行失败了,你想从一个干净的“工作表”重新开始?
-
要启用此功能,我将 System.currentTimeMillis() 添加到作业参数中。一个用例可能是源系统中的数据发生变化,我需要重新运行作业。
-
我可以尝试使用与以前的
System.currentTimeMillis()对应的相同long重新运行相同的作业,并最终在同一个作业实例上运行,但 Spring Batch 会阻止我如果上一次执行成功,则运行两次。
标签: java spring transactions spring-batch