无论完成状态如何,如何检查作业是否仍然 运行 或已完成

How to check if a job is still running or is finished regardless of finalization status

使用 Spring Boot(1.5) 项目在 Spring 批次 (3) 中工作。我有一个通过 Web 控制器异步执行的结束工作 "endOfDayJob",在控制器中我返回作业执行 ID。

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

@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();
    }

}

这里是网络控制器的代码。

@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;

    }

}

然后我想在控制器中添加新方法来知道作业是否结束。有什么可能的方法来检查作业是否仍然 运行 或已经完成而不考虑最终状态?

Then i want to add new method in the controller to to know if the job ended or not.

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

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