SpringBatch从入门到放弃003- 核心概念2
1. Job
Job是一个封装了 Batch 整个执行过程的实体,和其他 Spring 工程一样,Job可以基于 XML 和 Java-based配置两种,但是无论使用怎样的配置,Job都在这个结构的顶层。结构层次如下:
在 Spring Batch 中,Job是 Step的一个容器,一个 Job 根据一定的逻辑聚合了一个或多个 Step,使 Step 按照一定的规则执行,同时 Job还可以定义在所有 Step 之上的属性,如Job是否可以重启。Job 具体的属性包括一下几类:
- Job 的名称,作为 Job 的唯一标识
- Job 内 Step 的执行顺序
- Job 是否支持重启
下边是一个基于 Java-based 配置的 Job 定义:
@Bean
public Job footballJob() {
return this.jobBuilderFactory.get("footballJob")
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.end()
.build();
}
1.1 JobInstance
一个 Job 的执行会生成一个 Job Instance,但是并不是每一次 Job 执行都会生成一个 Job Instance。在 Launch一个 Job 的时候,如果根据 Job 名称和运行参数判断当前 Job Repository中已经存在一个 Job Instance ,就会继续执行已经存在的,如果不存在则会新启一个Job Instance。所以 Job Instance 可以理解为:
Job Instance = Job Name + Job Parameters
1.2 JobParameters
Job Parameters 是运行时 Job 需要传入的参数,会存储在 Job 运行的上下文中:
如上图中这个例子,EndOfDay 时一个 Job,运行的时候会生成一个 Job Instance,这个 Instance 接受一个日期类型的参数 D1(Job Parameters),那这个 Instance 就会被唯一标记为D1的 EndOfDay 。
Spring Batch 框架允许有不用来标记一个 Job Instance 的参数。
1.3 JobExecution
Job 的每一次运行,不管成功还是失败都会产生一条 JobExecution 记录,这个记录包括状态,开始时间,结束时间,推出原因,运行参数等整个运行期间的所有信息。一个 Job Instance 如果运行成功会对应一个 Job Executions,如果运行失败会对应多条 Job Execution。
这里我们先来了解一下概念。具体Job Execution 的表我们会在后续章节中介绍,
2. Step
Step 是批处理的一个最小的执行事务,这个执行事务可以是一个实现Tasklet接口的实现类,也可以是标准的 reader/processor/writer 结构。一个 job 包含至少一个 Step ,多个 Step 可以有一定的逻辑顺序。同样的每个 Step 执行对应一个或多个 Step Execution。执行成功对应的一条记录,执行失败,对应多条记录。Step Executioon 同样会记录运行期的全部数据。
3. ExecutionContext
Execution Context 用来记录 Job Execution 和 Step Execution 状态的键值对集合,主要是用来方便的进行现场的恢复,比如在 ItemReader 执行前,记录当前的状态,当 ItemReader执行期间遇到异常推出,或者母体程序异常关闭,更或者机房断电等意外发生时,我们可以保存执行的前的状态,根据这个状态,重新开始。
所以 Execution Context 包括 JobExecutionContext 和 StepExecutionContext 两部分,分别对应各自的表,表结构我们在后续章节介绍。
4. 配置一个 Job
如果基于Java-based 配置一个 Job,我们一般通过JobBuilderFactory get到一个 JobBuilder
@Bean
public Job footballJob() {
return this.jobBuilderFactory.get("footballJob")
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.end()
.build();
}
然后根据传入的参数会得到一个 SimpleJobBuilder 或者 JobFlowBuilder :
在 SimpleJobBuilder 中我们可以看到有下列属性可以设置:
在 JobFlowBuilder 中则可以设置如下属性:
5. 运行一个 Job
对于非 web 应用程序,框架提供了 CommandLineJobRunner 用于 launch 一个 batch 的运行:
<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay
schedule.date(date)=2007/05/05
这种方式每次运行都会生成一个新的 JobLaunch。
对于 Web 应用程序,我们只需要注入一个 JobLaunch 即可,在代码中注入一个 JobLaunch,可以直接调用 jobLaunch.run 方法,执行一个 Job。
运行代码如下:
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
}
在 Web 程序中,因为 Spring Bean 的单例特性,所以所有的启动是一同一个 JobLaunch。
截止到目前所有的 Batch 领域概念都已经介绍完了,后边我们将进入实例阶段,介绍真正执行逻辑的 Reader/Processor/Writer。
最新文章
- iframe关于滚动条的去除和保留
- 流行ORM产品优缺点分析--EntityFramework、NHibernate、PetaPoco
- struts2上传图片的全过程
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章05
- gitlab&;fengoffice的ldap配置
- bzoj 1009:[HNOI2008]GT考试
- java.util.TreeMap源码分析
- SignalR 2.0入门
- Qt 属性
- 反射以及 getDeclaredMethods()和getMethods()区别
- 打不开BT,一直重复的关闭开启。
- CentOS7使用dnf安装mysql
- 完全自主创建Wrapper Tomcat容器
- YApi二次开发环境部署
- 5.jQuery
- Python学习(十七)—— 数据库(二)
- 跳过复制错误——slave_skip_errors、slave_exec_mode
- mysql普通查询日志
- 你了解border-radius吗?
- CoderForces 689A Mike and Cellphone (水题)