如何获取具有已完成状态的 Spring Batch 作业的最后执行的开始或结束日期?

Posted

技术标签:

【中文标题】如何获取具有已完成状态的 Spring Batch 作业的最后执行的开始或结束日期?【英文标题】:How to get the start or end date of the last execution of a Spring Batch job that has a completed status? 【发布时间】:2022-01-04 04:11:53 【问题描述】:

我正在编写一个 Spring Batch 进程(Spring boot 2.x.x)。该作业根据上次更新日期从表中选择一些行 -

(select * from tablename where last_upd_dt >= :lastruntime).

:lastruntime 是作业最后一次(成功)完成运行的日期。我正在尝试使用 JobListener/JobExecutionListener 从 Listener 类中的 beforeJob 方法中获取此日期。

有没有办法利用 Spring Batch 框架提供的类?否则,我将不得不从另一个表中写入和检索此信息。

【问题讨论】:

【参考方案1】:

您可以使用JobExplorer API。它允许您获取作业实例的作业执行。一旦你得到它,你可以根据需要过滤结果并从 JobExecution 对象中获取开始/结束日期。

【讨论】:

【参考方案2】:

我能够使用 JobExplorer API。

private Date fetchPreviousJobCompletetionDate() 
    Date previousJobCompleteDate = null;
    try 
        Integer jobInstanceCount = jobExplorer.getJobInstanceCount("myjob");
        List<JobInstance> jobInstances = jobExplorer.getJobInstances("myjob", 0, jobInstanceCount);
        List<JobExecution> jobExecutions = jobInstances.stream().map(jobExplorer::getJobExecutions)
                .flatMap(List<JobExecution>::stream)
                .filter(param -> param.getExitStatus().equals(ExitStatus.COMPLETED)).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(jobExecutions)) 
            Optional<JobExecution> jobExecutionOptional = jobExecutions.stream().sorted((JobExecution execution1, JobExecution execution2) -> execution2.getStartTime()
                    .compareTo(execution1.getStartTime())).findFirst();
            if (jobExecutionOptional.isPresent()) 
                previousJobCompleteDate = jobExecutionOptional.get().getStartTime();
            
        
     catch (NoSuchJobException exception) 
        log.error("Exception occurred ", exception.getMessage());
    
    return previousJobCompleteDate;

【讨论】:

以上是关于如何获取具有已完成状态的 Spring Batch 作业的最后执行的开始或结束日期?的主要内容,如果未能解决你的问题,请参考以下文章

Java Spring Batch:如何验证执行是并行完成的?

Spring Batch - 有没有办法异步执行 TaskletStep?

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?

Spring Batch 作业状态未在数据库中更新

如何确保 SFTP 会话始终在 spring-batch 结束时关闭

带有状态更改的 Spring Batch 查询