如何在没有作业参数的情况下自动运行Spring Batch作业?

问题描述 投票:0回答:1

我正在编写一个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)方法以便首先接受参数,而不是每次都创建。

如果您在此处缺少任何内容以接受失败的工作的工作参数,请提供代码帮助,我将非常感谢。

spring-batch jobs restart
1个回答
1
投票

成功完成后如何重新运行该作业?

这在设计上是不可能的。作业实例只能运行一次才能完成。有关更多详细信息,请参考Batch domain language部分。

如果我在作业参数中传递当前时间戳或使用(新的增量器)。如果失败,则我正在重新运行该作业,并且由于使用了时间戳或(新的增量器)它正在创建一个新实例。

如果正在创建新的作业实例,则意味着您没有传递与先前失败的执行相同的参数。确保传递相同的identifying作业参数以重新启动相同的实例。

© www.soinside.com 2019 - 2024. All rights reserved.