簡體   English   中英

將Spring Batch與Spring Boot結合使用時,如何始終為每次運行啟動新的作業實例?

[英]How to always start a new job instance for each run when using spring batch with spring boot?

在將Spring Batch與Spring Boot結合使用時,我們將得到一個胖罐子,其中包含我的所有Spring Batch作業,我希望能夠通過指定作業名稱從命令行觸發特定作業,問題是Spring Batch檢測到作業已完成,因此它將只運行一次,使用spring boot,我們可以使用--spring.batch.job.names=jobToRun來指定名稱,問題是我如何使它始終啟動一個新實例並仍然能夠使用此機制傳遞作業名稱以運行。

我沒有配置JobLauncher,所以我猜它正在使用默認的JobLauncherCommandLineRunner ,我當前配置的是:

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

使用此配置,我可以從命令行運行作業:

java -jar batch.jar --spring.batch.job.names=job1ToRun

如何使用類似機制為每次運行啟動一個新實例? 我需要從命令行指定作業名稱以選擇要運行的作業。

spring-batch文檔

CommandLineJobRunner

由於啟動作業的腳本必須啟動Java虛擬機,因此需要一個具有main方法的類作為主要入口點。 Spring Batch提供了一個僅用於此目的的實現:CommandLineJobRunner。 重要的是要注意,這只是引導應用程序的一種方法,但是有許多方法可以啟動Java進程,並且絕對不應將此類視為權威。 CommandLineJobRunner執行四個任務:

  • 加載適當的ApplicationContext
  • 將命令行參數解析為JobParameters
  • 根據參數找到合適的工作
  • 使用應用程序上下文中提供的JobLauncher啟動作業。

有關如何執行此操作的一個非常基本的示例:

 public static void main(String[] args) throws Exception {
    ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
    JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
    String jobName = args[0] // assuming args[0] is the jobName
    JobParameters jobParameters = createJobParameters(args)
    Job jobInstance = ctx.getBean(jobName, Job.class);          
    jobLauncher.run(jobInstance, jobParameters);                   
}

private static JobParameters createJobParameters(String[] args) {
    // TODO: Create & return the needed parameters 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM