【问题标题】:How to check if a job is still running or is finished regardless of finalization status无论最终状态如何,如何检查作业是否仍在运行或已完成
【发布时间】:2020-05-13 19:22:23
【问题描述】:

使用 Spring Boot(1.5) 项目在 Spring Batch (3) 中工作。我有一个通过 Web 控制器异步执行的日终作业“endOfDayJob”,在控制器中我返回作业执行 ID。

在配置类的代码下方。在这里突出显示我正在实现 BatchConfigurer 接口并使用 SimpleAsyncTaskExecutor 创建一个 async JobLauncer。

@Configuration
@EnableBatchProcessing
@EnableAsync
public class BatchConfiguration implements BatchConfigurer {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private DataSource dataSource;

    @Bean
    public Job endOfDayJob() throws Exception {

        SimpleJobBuilder simpleJobBuilder = jobBuilderFactory.get("endOfDayJob")
            .incrementer(new RunIdIncrementer())
            .start(init())
            .next(updateInventory())
            .next(generateSalesReport())
            .next(cleanup())
            .next(sendReport());

        return simpleJobBuilder.build();
    }

    @Bean
    public Step init() {
        return stepBuilderFactory.get("initStep").tasklet(initTasklet()).build();
    }

    @Bean
    public Step updateInventory() {
        return stepBuilderFactory.get("updateInventoryStep").tasklet(updateInventoryTasklet()).build();
    }

    @Bean
    public Step generateSalesReport() {
        return stepBuilderFactory.get("generateSalesReportStep").tasklet(generateSalesReportTasklet()).build();
    }

    @Bean
    public Step cleanup() {
        return stepBuilderFactory.get("cleanupStep").tasklet(cleanupTasklet()).build();
    }

    @Bean
    public Step sendReport() {
        return stepBuilderFactory.get("sendReportStep").tasklet(sendReportTasklet()).build();
    }

    @Override
    public JobRepository getJobRepository() throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(getTransactionManager());
        factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
        factory.setTablePrefix("BATCH_");
        return factory.getObject();
    }

    @Override
    public PlatformTransactionManager getTransactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }

    @Override
    public JobLauncher getJobLauncher() throws Exception {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(getJobRepository());
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        jobLauncher.afterPropertiesSet();
        return jobLauncher;
    }

    @Override
    public JobExplorer getJobExplorer() throws Exception {
        JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean();
        jobExplorerFactoryBean.setDataSource(dataSource);
        jobExplorerFactoryBean.setTablePrefix("BATCH_");
        jobExplorerFactoryBean.afterPropertiesSet();
        return jobExplorerFactoryBean.getObject();
    }

}

这里是 web 控制器的代码。

@RestController
@RequestMapping("/api/job")
public class WebController {

    private static final Logger logger = LoggerFactory.getLogger(WebController.class);

    @Autowired
    private DataSource dataSource;

    @Autowired
    private BatchConfiguration batchConfiguration;

    @Autowired
    private JobLauncher jobLauncher;

    @GetMapping("/endOfDayJob")
    private Long kycrBatch(@RequestParam(value = "odate", required = true) String odate) {

        logger.info("ExecutingendOfDayJob with odate = {}", odate);

        if (odate == null || odate.isEmpty() || odate.trim().isEmpty()) {
            return -1L;
        }

        JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
        jobParametersBuilder.addString("odate", odate);

        long jobExecutionId = -1L;

        try {

            Job endOfDayJob = this.batchConfiguration.endOfDayJob();
            jobParametersBuilder.addDate("runtime", new Date());
            jobExecutionId = jobLauncher.run(endOfDayJob, jobParametersBuilder.toJobParameters()).getId();

        } catch (Exception e) {
            logger.error("Error ocurred executing endOfDayJob with message: {}", e.getMessage());
            return -1L;
        }

        return jobExecutionId;

    }

}

然后我想在控制器中添加新方法以了解作业是否结束。无论完成状态如何,有什么方法可以检查作业是否仍在运行或已经完成??

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    然后我想在控制器中添加新方法以了解作业是否结束。

    您可以在控制器中注入JobExplorer 并编写如下内容:

    public boolean isRunning(long jobExecutionId) {
        JobExecution jobExecution = jobExplorer.getJobExecution(jobExecutionId);
        return jobExecution.isRunning();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2021-12-26
      • 2015-06-28
      • 2017-11-13
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多