Step Scope
Step Scope时SpringBatch框架提供的自定义的Scope,将SpringBean定义为Step Scope,支持SpringBean在Step开始的时候初始化,在Step结束的时候销毁SpringBean,将
SpringBean的生命周期与Step绑定。
在SpringBatch框架中,Step Scope会自动被注册到Spring上下文中,如果没有使用Spring的配置文件,需要显示的声明Step Scope。
<bean:bean id="csvItemReader"
class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
...
...
</bean:bean>
通过属性scope=”step”来定义csvItemReader的生命周期和Step绑定
运行Job
SpringBatch 框架提供了一组执行Job的接口。包括JobLauncher、JobExplorer和JobOperator三个操作Job的接口。
JobLauncher 是最常用的作业调度器,通过给定的Job Name 和Job Parameters 可以执行Job;
JobExplorer 主要负责从JobRepository中获取执行的信息,包括获取作业实例、获取作业执行器、获取作恶步执行器、获取正在运行的作业执行器、获取作业列表等操作;
JobOperator 包含了JobLauncher和JobExplorer中的大部分操作。
调度作业
通过JobLauncher来调度作业
// 调度作业
ApplicationContext context = new ClassPathXmlApplicationContext("job.xml");
JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("billJob");
try {
JobExecution result = launcher.run(job, new JobParameters());
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
JobLauncher支持对作业的同步、异步两种调用模式。
同步异步
配置异步调用的JobLauncher只需要增加属性taskExecutor,该属性表示当前执行的线程池。
<!-- 配置异步JobLauncher -->
<!-- 配置大小为5的线程池 -->
<task:executor id = "executor" pool-size="5" />
<bean:bean id = "jobLauncherAsyn"
class = "org.springframework.batch.core.launch.support.SimpleJobLauncher">
<bean:property name = "jobRepository" ref ="jobRepository" />
<!-- 为作业调度器配置执行的线程池,
作业执行期间会从线程池中选择一个线程执行Job
-->
<bean:property name = "taskExecutor" red="executor" />
</bean:bean>
Job与外界系统
在实际的Job使用场景中,标准Web应用、定时任务调度器、命令行等都可能触发不同的Job操作。
与定时任务集成
SpringBatch提供了Job的执行能力,其本身不是一个定时调度框架,因此可以将定时调度框架和SpringBatch结合起来完成定时作业。Spring本身提供了一个轻量级的调度框架Spring scheduler。
<!-- 执行定时任务的线程池大小 -->
<task:scheduler id="scheduler" pool-size="100" />
<!-- 每一分钟,执行对象schedulerLauncher的launch方法一次 -->
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="schedulerLauncher" method="launch" fixed-rate="1000"/>
</task:scheduled-tasks>
<bean:bean id = "schedulerLauncher" class = "">
<bean:property name = "job" ref = "hellowordJob" />
<bean:property name="jobLauncher" ref="jobLauncher" />
</bean:bean>
<!-- HellowordJob -->
<job id = "hellowordJob">
<step>
...
...
</step>
</job>
public class SchedulerLauncher {
private Job job;
private JobLauncher jobLauncher;
public void launch() throws Exception{
JobParameters jobParams = this.createJobParameters();
jobLauncher.run(job, jobParams);
}
private JobParameters createJobParameters(){
JobParameters jobParams = new JobParametersBuilder()
.addDate("executeDate", new Date()).toJobParameters();
return jobParams;
}
}
与Web应用集成
SpringBatch框架基于Spring开发,可以方便的内嵌在web应用中使用,这样批处理作业可以通过HTTP协议进行远程的访问。同样可以在web应用中内嵌定时任务处理框架,方便在web应用内部通过定时框架调用SpringBatch中定义的Job。