SpringBatch 配置Job之二

来源:互联网 发布:java被取代 知乎 编辑:程序博客网 时间:2024/06/08 15:56

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。

这里写图片描述

0 0
原创粉丝点击