Spring Batch - 修改我的应用程序以便我可以将 JobParameters 传递给我的设置

Springbatch - Modifying my application so I can pass JobParameters to my Setup

我目前有这样的 springbatch 应用程序:

@SpringBootApplication
@EnableBatchProcessing
public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);

}
}

我有一个存储库配置文件,它在本地使用 h2 数据库来维护作业存储库、创建作业启动器和其他内容。 post 的突出部分是:

protected JobLauncher createJobLauncher() throws Exception {

    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);

    jobLauncher.afterPropertiesSet();
    return jobLauncher;
}

最后,我在另一个配置文件中有了作业 bean:

@Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep)
            .end()
            .build();
}

我需要能够传递作业参数,例如:

JobParameters jobParameters = new JobParametersBuilder()
            .addDate("date", new Date())
            .toJobParameters();

,主要是为了确保每个作业实例的唯一性。但是,我的问题是我无法弄清楚如何调整我的应用程序以将这些传递给工作。我通常会看到这些在作业启动器的 运行 方法中传递,例如:

jobLauncher.run(job, new JobParameters());

,但我从未真正调用过该方法,因为我猜是因为我使用了 springboot 应用程序,它可能是通过应用程序上的 @EnableBatchProcessing 注释在幕后完成排序的。

因此,我需要重新配置我的应用程序以更改作业的启动方式,以便能够传递作业参数。但是我一直没有成功地弄清楚这一点。如果有任何想法,我将不胜感激。谢谢。

好的,我有办法。我的好朋友 Hassine 先生向我指出了这一点,他似乎有能力发现 spring我自己无法发现的批次的解决方案!

关注 Hsssine 先生的 link:https://github.com/spring-guides/gs-batch-processing/issues/15

我接受了我的原始申请:

@SpringBootApplication
@EnableBatchProcessing
public class Application {

    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);

    }
}

,并代入:

@SpringBootApplication
public class Application {

public static void main(String[] args) throws Exception {
        
    ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);

    JobLauncher jobLauncher = applicationContext.getBean(JobLauncher.class);
    Job job = applicationContext.getBean(Job.class);

    JobParameters jobParameters = new JobParametersBuilder()
            .addDate("date", new Date())
            .toJobParameters();

    jobLauncher.run(job, jobParameters);
}

}

另外,我必须补充:

spring.batch.job.enabled=false

到我的 application.properties,它强制 springboot 绕过 auto-magic jobLauncher.run(job, jobParameters),而是寻找我提供的任何替代启动在我上面代码中的主要 class 中。这样,我可以直接添加 jobParameter,它添加了一个时间戳,以确保每个作业实例都是唯一标识的,这(希望)将防止 spring 尝试 re-starting 旧的孤立作业实例的徒劳尝试作业实例标识符。