【问题标题】:Spring Batch - How to access JobParameters or JobExecution for a dynamically created Job?Spring Batch - 如何访问动态创建的作业的 JobParameters 或 JobExecution?
【发布时间】:2019-02-12 16:14:01
【问题描述】:

我有一个动态创建/配置的 ReportJobs 列表,这些列表作为标准 Spring 批处理作业实例实现。这些作业由 Spring Task Scheduler 执行

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.setScheduler(taskExecutor());

    // create report jobs
    for (Map.Entry<String, ReportConfiguration> entry : jobsConfiguration.getReports().entrySet()) {
        final ReportConfiguration reportConfiguration = entry.getValue();
        final Job reportJob = createReportJob(entry.getKey(), reportConfiguration);

        CronTask ct = new CronTask(new Runnable() {
            @Override
            public void run() {
                final JobParameters jobParameters = new JobParametersBuilder()
                    .addDate("started", new Date())
                    .toJobParameters();

                try {
                    jobLauncher.run(reportJob, jobParameters);
                } catch (JobExecutionException e) {
                    LOG.warn("cannot execute reportJob");
                }
             }
        }, reportConfiguration.getCron());

        taskRegistrar.addCronTask(ct);
    }
}

如您所见,这些作业不是 spring bean,它们是动态创建的。在 ItemWriter 或 Job 处理器执行期间是否可以访问 JobParameters 等?

【问题讨论】:

    标签: spring-boot spring-batch


    【解决方案1】:

    如果您知道作业的名称,则可以使用 JobExplorer 检索 jobInstance 并使用相同的 JobExplorer 从 JobInstance 检索 JobExecutions。

    【讨论】:

      【解决方案2】:

      是否可以在 ItemWriter 或 Job 处理器执行期间访问 JobParameters 等?

      是的,您可以使用@BeforeStep 回调将步骤执行保存在您的处理器/写入器中,然后您可以从StepExecution 获取访问作业参数。这是一个例子:

      public class MyItemWriter implements ItemWriter<Object> {
         private StepExecution stepExecution;
      
         public void write(List<? extends Object> items) throws Exception {
            JobParameters jobParameters = this.stepExecution.getJobParameters();
            // use job parameters
         }
      
         @BeforeStep
         public void saveStepExecution(StepExecution stepExecution) {
            this.stepExecution = stepExecution;
         }
      
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        相关资源
        最近更新 更多