持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
这篇文章我们来讲一下JobExecution。
JobExecution 是什么
在我们了解了Job 以及JobInstance 之后,我们就可以讲一下JobExecution 的概念了。JobExecution 是指单次运行Job 的,在代码层级的相关概念。
但是JobExecution 只可以说是尝试运行一次job 的概念。因为这一次执行可能失败。另外我们也知道,JobInstance 的作用就是用来描述一个Job 运行的实例。只有当Job 执行完全成功的时候(JobExecution 执行成功),给定的与这次执行对应的JobInstance 才会被认为执行成功。
我们举例来说,就拿给员工发放福利返现任务这个场景做解释,这个任务每月执行一次,我们以时间为标准设置JobParameters,假设第一次设置的参数为2022-10-01,但是这次任务由于一些不可控因素(网络、抖动等等)失败了,那么我们会继续使用2022-10-01 的JobParameters 参数来继续运行这个Job。我们继续假设第二次这个Job 运行成功了。那么我们来看这个过程中涉及到的一些概念:
- 2022-10-01 这个JobParameters 对应的任务就是一个JobInstance
- 第一次失败的运行和第二次成功的运行对应的是两个JobExecution 实例
总结来说,就是一个JobInstance 对应了两个JobExecution。
我们接下来看一下JobExecution 的接口定义:
public interface JobExecution {
public long getExecutionId();
public String getJobName();
public BatchStatus getBatchStatus();
public Date getStartTime();
public Date getEndTime();
public String getExitStatus();
public Date getCreateTime();
public Date getLastUpdatedTime();
public Properties getJobParameters();
}
由于这些接口的定义都比较清晰,所以不做过多的解释了。但是这些方法中有一个需要说明一下,就是public BatchStatus getBatchStatus();
对于这个方法的返回参数BatchStatus 其实是一个枚举,用来代表job 的运行状态。这个方法的作用就是用来获取一个job 某一次执行的一个状态。枚举类型的代码如下:
public enum BatchStatus {
COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKNOWN;
}
这些其实对于每个Job 来说非常关键,Spring Batch 在运行的过程中会创建出来一些可以持久化这些数据的表,用来将这些数据持久化。
总结
这篇文章我们主要讲述了JobExecution 的概念,同时举例说明了各个概念在job 运行过程中的表现,比较容易理解。