【问题标题】:Spring Batch Job logging on completionSpring Batch Job 完成时记录
【发布时间】:2018-10-12 08:50:26
【问题描述】:

我有一个像这样运行的 Spring 批处理作业:

public void myMethod() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
    logger.log("Job Starting");

    JobParameters param = new JobParametersBuilder()
            .addString("JobID", String.valueOf(System.currentTimeMillis()))
            .toJobParameters();

    jobLauncher.run(myJob(), param);

    logger.log("Job Finished");
}

这通过使用TaskExecutor 异步运行。所以第二个 logger.log 在调用作业后立即记录。

我希望在myJob() 完成后记录日志。

我已尝试更改实际工作以执行此操作,但这似乎不是最佳解决方案。我还尝试寻找诸如andThenonComplete 之类的方法,但我找不到任何东西。

有没有办法做到这一点?

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    您可能想看看JobExecutionListener,它允许您在作业执行之前和之后进行一些处理。

    public class DoSomethingAroundJob implements JobExecutionListener {
    
      public void beforeJob(JobExecution jobExecution) {
          System.out.println("Called beforeJob().");
      }
    
      public void afterJob(JobExecution jobExecution) {
          System.out.println("Called afterJob().");
      }
    }
    

    然后你需要配置你的 Job 来使用这个监听器。例如。

    @Bean
    public Job myJob(){
        return jobs.get("myJob")           
            .listener(new DoSomethingAroundJob())          
            .build();
    }
    

    您的工作还有其他部分,但上面只是显示了一个使用 JavaConfig 添加侦听器的示例。

    【讨论】:

    • 我支持这个答案,这就是我在问题中实现用例的方式。