将Spring Batch与Spring Boot结合使用时,如何始终为每次运行启动新的作业实例?

时间:2019-08-09 06:06:16

标签: java spring spring-boot spring-batch

在使用带有弹簧启动的Spring Batch时,我们将得到一个包含所有Spring Batch作业的胖子罐,但我希望能够通过指定作业名称从命令行触发特定作业,但问题是spring batch检测到作业已完成,因此它将只运行一次,使用spring boot,我们可以使用public function pdf() { $users = User::get(); $pdf = PDF::loadView('pdf', compact('users')); $pdf->getDomPDF()->setHttpContext( stream_context_create([ 'ssl' => [ 'allow_self_signed'=> TRUE, 'verify_peer' => FALSE, 'verify_peer_name' => FALSE, ] ]) ); return $pdf->download('Users.pdf'); } 指定名称,问题是如何使它始终启动新实例并仍然能够使用此机制传递作业名称以运行。

我没有配置JobLauncher,所以我猜它正在使用默认的--spring.batch.job.names=jobToRun,我当前配置的是:

JobLauncherCommandLineRunner

通过这种配置,我可以从命令行运行作业:

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

如何使用类似的机制为每次运行启动一个新实例?我需要从命令行指定作业名称,以选择要运行的作业。

1 个答案:

答案 0 :(得分:0)

spring-batch documentation

  

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 
}