1. 开始执行一个Step
单线程的Step一般使用的实现类是TaskletStep
Step的执行从 Step抽象类 AbstractStep中的execute方法开始
这个方法完成了一下几个工作
1.1 Step执行前的准备工作
- 更新StepExecution 也就是Step执行信息到存储库
- 注册StepExecution
- 触发Step监听器的beforeStep方法
- 执行steam接口的open方法
stepExecution.setStartTime(new Date());
stepExecution.setStatus(BatchStatus.STARTED);
getJobRepository().update(stepExecution);
ExitStatus exitStatus = ExitStatus.EXECUTING;
doExecutionRegistration(stepExecution);
getCompositeListener().beforeStep(stepExecution);
open(stepExecution.getExecutionContext());
1.2. 开始执行Step
- 执行Step
- 获取退出状态
- 跟通信stepExecution中的状态
doExecute(stepExecution);
exitStatus = ExitStatus.COMPLETED.and(stepExecution.getExitStatus());
if (stepExecution.isTerminateOnly()) {
throw new JobInterruptedException("JobExecution interrupted.");
}
stepExecution.upgradeStatus(BatchStatus.COMPLETED);
1.3. Step异常处理
stepExecution.upgradeStatus(determineBatchStatus(e));
exitStatus = exitStatus.and(getDefaultExitStatusForFailure(e));
stepExecution.addFailureException(e);
1.4. Step收尾处理
- 计算退出状态
- 更新StepExecutionContext到资源库
- 更新StepExecution到资源库
- 执行steam的close方法
- 释放StepExecution
exitStatus = exitStatus.and(stepExecution.getExitStatus());
stepExecution.setExitStatus(exitStatus);
exitStatus = exitStatus.and(getCompositeListener().afterStep(stepExecution));
try {
getJobRepository().updateExecutionContext(stepExecution);
} catch (Exception e) {
stepExecution.setStatus(BatchStatus.UNKNOWN);
exitStatus = exitStatus.and(ExitStatus.UNKNOWN);
stepExecution.addFailureException(e);
}
stepExecution.setEndTime(new Date());
stepExecution.setExitStatus(exitStatus);
try {
getJobRepository().update

最低0.47元/天 解锁文章
5430

被折叠的 条评论
为什么被折叠?



