– Start
点击此处观看本系列配套视频。
在上个例子中,我们使用 XML 的方式定义了一个叫做 EndOfJob 的 Job,跑完 Job 后,试一试执行下面的 SQL 看看结果吧。
select * from BATCH_JOB_INSTANCE;
select * from BATCH_JOB_EXECUTION;
select * from BATCH_JOB_EXECUTION_PARAMS;
select * from BATCH_JOB_EXECUTION_CONTEXT;
select * from BATCH_STEP_EXECUTION;
select * from BATCH_STEP_EXECUTION_CONTEXT;
Job
Job 是 Spring Batch 的核心概念,它包含了批处理的所有操作,Spring 使用 batch:job 定义 Job
<batch:job id="EndOfJob" job-repository="jobRepository">
<batch:step id="EndOfStep">
<batch:tasklet ref="endOfTasklet"/>
</batch:step>
</batch:job>
Step
每个 Job 由一个或多个 Step 组成。Spring 使用 batch:step 定义 Step。
Tasklet
每个 Step 由一个 Tasklet 组成,通常我们需要实现 Tasklet 接口来定义自己的 Tasklet。
JobRepository
从上面的代码片段可以看到,定义 Job 时,需要指定一个 JobRepository,用来存储 Job 在运行过程中的状态信息,为什么要存储状态信息呢?因为如果 Job 失败了,Spring 支持从失败的地方重新运行,而不是从头开始。事实上,如果你的 JobRepository 实例的名字是 jobRepository,不需要指定也可以,从而简化我们配置。
JobLauncher
看看下面的代码片段,JobLauncher 用来运行 Job
// job 和 job 参数
Map<String,JobParameter> parameters = new HashMap<>();
parameters.put("business_date", new JobParameter("20170505"));
JobParameters jobParameters = new JobParameters(parameters);
Job job = context.getBean(Job.class);
// 运行 job
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
jobLauncher.run(job, jobParameters);
通常我们都是通过命令行启动 Job,我们可以使用 CommandLineJobRunner
bash$ java CommandLineJobRunner D://EndOfJob.xml EndOfJob business_date=20170505
JobParameters
从上面的代码片段可以看到,运行 Job 时,我们可以给 Job 传递参数,参数会保存到 BATCH_JOB_EXECUTION_PARAMS 表中
JobInstance
当我们运行一个 Job 时,Spring 会根据 JobParameters 查询 BATCH_JOB_INSTANCE 表,如果不存在则插入一条数据,如果存在则说明是失败后重新运行,Spring 会根据表中的状态信息在失败的地方重新运行。如果我们重新运行一个已经成功的 Job 会怎么样呢?就向上个例子演示的那样,会抛异常。
JobExecution 和 ExecutionContext
每次运行 Job 时,Spring 都会往 BATCH_JOB_EXECUTION 表插入一个数据,保存 Job 开始,结束时间,状态等信息。
有时候我们需要在 Job 的执行过程中初始化并访问一些变量,因此每个 JobExecution 都有一个 ExecutionContext 对象,它其实就是一个 Map,存储在 BATCH_JOB_EXECUTION_CONTEXT 表中
StepExecution 和 ExecutionContext
每次运行 Step 时,Spring 都会往 BATCH_STEP_EXECUTION 表插入一个数据,保存 Step 开始,结束时间,状态等信息。
有时候我们需要在 Step 的执行过程中初始化并访问一些变量,因此每个 StepExecution 都有一个 ExecutionContext 对象,它其实就是一个 Map,存储在 BATCH_STEP_EXECUTION_CONTEXT 表中。
– 更多参见:Spring Batch 精萃
– 声 明:转载请注明出处
– Last Updated on 2017-07-24
– Written by ShangBo on 2017-07-15
– End