我正在编写一个spring batch以从一个数据库读取数据,然后以spring batch的方式写入另一个数据库。我将根据业务需求手动(大约每月一次)手动运行该作业。
我的问题是,如果我不添加任何作业参数,则每次成功完成作业后,我的作业都会被视为相同的作业实例。成功完成后如何重新运行该工作?
如果我在作业参数中传递当前时间戳或使用(新的增量器)。如果失败,则我正在重新运行该作业,并且由于使用了时间戳或(新的增量器)它正在创建一个新实例。
我正在考虑通过.properties文件传递工作名称。成功完成后,每次我要重新运行作业时,我都会更改作业名称。我有什么更好的解决方案吗?我已附上我的代码
public static void main(String[] args) {
SpringApplication.run(Db2MySqlLoadApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
JobParameters params = new JobParametersBuilder()
.addDate("date" ,new Date())
.toJobParameters();
jobLauncher.run(job,params);
}
@Bean
public Job cdsRead(Step stepA)
{
return jobBuilderFactory.get("CDS-LOAD-JOB")
.incrementer(new RunIdIncrementer())
.start(stepA)
.build();
}
@Bean
public Step stepA(ItemReader<RecData> itemReader , ItemWriter<RecData> itemWriter)
{
return stepBuilderFactory.get("REC-LOAD-STEP")
.<RecData, RecData>chunk(10000)
.reader(itemReader)
.processor(itemProcessor())
.writer(itemWriter)
.build();
}
当我第一次使用上述代码运行时,它失败了。我在控制台中看到了这个:作业使用以下参数启动:[{date = 1589907545476}]
我正在尝试重新启动此作业,并且在intellij中传递了失败的作业参数“ 1589907545476”。我原本希望我的工作能够重新启动,但实际上它创建了一个新实例并运行“启动了以下参数:[{date = 1589907885859}]“
我是否需要更改run(String ... args)方法以便首先接受参数,而不是每次都创建。
如果您在此处缺少任何内容以接受失败的工作的工作参数,请提供代码帮助,我将非常感谢。
成功完成后如何重新运行该作业?
这在设计上是不可能的。作业实例只能运行一次才能完成。有关更多详细信息,请参考Batch domain language部分。
如果我在作业参数中传递当前时间戳或使用(新的增量器)。如果失败,则我正在重新运行该作业,并且由于使用了时间戳或(新的增量器)它正在创建一个新实例。
如果正在创建新的作业实例,则意味着您没有传递与先前失败的执行相同的参数。确保传递相同的identifying作业参数以重新启动相同的实例。