zoukankan      html  css  js  c++  java
  • spring batch (四) Job的配置及配置文件说明介绍

    内容来自《Spring Batch 批处理框架》,作者:刘相。
    我只是个搬运工。

    一、Spring Batch提供了独立的标签用来顶一个Job配置,分别是job、step、tasklet、chunk等。共有6个外层标签使用,如下:

    <batch:job id=""></batch:job><batch:flow id=""></batch:flow>
    <batch:job-listener></batch:job-listener>
    <batch:job-repository/>
    <batch:step id=""></batch:step>
    <batch:step-listener></batch:step-listener>

    二、Job配置的标签和属性介绍  

      1.job标签共有6个属性,分别是:

    <batch:job id="" job-repository="" incrementer="" restartable="" parent="" abstract="true"></batch:job>

        id:Job名称,作业的唯一标识。在整个跑批程序运行上下文中不允许重复。
        job-repository:指定作业仓库。定义该Job运行期间使用的Job仓库,默认使用名字为jobRepository的Bean。
        incrementer:作业参数递增器。只有在org.springframework.batch.core.launch.JobOperator 的 startNextInstance方法中使用。
        restartable:作业是否可以重启。默认是true,表示支持重启。当设置为true时,只有当JobInstance为FAILED状态时才可以重启。
        parent:指定该作业的父类作业。指定当前Job的父Job,Job可以从其他Job继承。通常在父Job中定义共有的属性。
        abstract:定义作业是否是抽象的,默认是true,抽象的,不能被实例化。  

      2.job标签的子元素

    <batch:job id="" job-repository="" incrementer="" restartable="" parent="" abstract="true">
      <batch:step id="" allow-start-if-complete="" next="" parent=""></batch:step>
      <batch:split id="" next="" task-executor=""></batch:split>
      <batch:flow parent="" id=""></batch:flow>
      <batch:decision decider="" id=""></batch:decision>
      <batch:listeners></batch:listeners>
      <batch:validator ref=""></batch:validator>
      <batch:description></batch:description>
    </batch:job>

        step:定义Job的作业步 。

        split:定义并行作业步Step。

        flow:引用独立配置的作业步流程。

        decision:定义作业步执行的条件判断器,用于判断后续执行的作业步。

        listeners:定义作业Job执行时的拦截器。

        validator:定义作业参数检验器。也就是JobParameters的验证器。

        description:描述该作业

      3.Job拦截器    

        Spring Batch框架提供了自己的拦截器,可以在Job执行前后加入自定义的逻辑判断,自定义拦截器需要实现接口:org.springframework.batch.core.JobExecutionListener。

        JobExecutionListener源码:

    public interface JobExecutionListener {
        void beforeJob(JobExecution jobExecution);
        void afterJob(JobExecution jobExecution);
    }

        自定义拦截器:

    public class MyListener implements JobExecutionListener {
        private static final Logger LOGGER = LoggerFactory.getLogger(MyListener.class);
    
        @Override
        public void beforeJob(JobExecution jobExecution) {
          String jobName = jobExecution.getJobParameters().getString("jobName");
          LOGGER.info(" -- > beforeJob 拦截的job名称:[{}]", jobName);
      }
    
      @Override
      public void afterJob(JobExecution jobExecution) {
        long instanceId = jobExecution.getJobInstance().getInstanceId();
        LOGGER.info(" -- > afterJob 拦截的job实例ID:[{}]", instanceId);
      }
    
    }

        Job配置拦截器:

    <bean id="myListener" class="com.jason.batch.job.listeners.MyListener"></bean>
    
    <batch:job id="firstJob" job-repository="jobRepository">
      <!-- 省略其余步骤 -->
      <batch:listeners>
        <batch:listener ref="myListener"></batch:listener>
      </batch:listeners>
    </batch:job>

        需要注意的是:如果拦截器方法出现异常,会导致Job执行的状态为“FAILED”,所以我们在设置拦截器的时候要注意异常的处理。

        在配置文件中也可以配置多个拦截器,多个拦截器的执行顺序按照配置的顺序执行。

        <batch:job id="firstJob" job-repository="jobRepository">
          <!-- 省略其余步骤 -->
          <!-- 多个拦截器配置 -->
          <batch:listeners>
            <batch:listener ref="listener_01"></batch:listener>
            <batch:listener ref="listener_02"></batch:listener>
            <batch:listener ref="listener_03"></batch:listener>
          </batch:listeners>
        </batch:job>

        则上面三个拦截器的执行顺序是:

          1.调用listener_01拦截器的before方法。

          2.调用listener_02拦截器的before方法。

          3.调用listener_03拦截器的before方法。

          4.调用listener_03拦截器的after方法。

          5.调用listener_02拦截器的after方法。

          6.调用listener_01拦截器的after方法。

        Spring Batch 中不仅可以实现接口设置拦截器,也可以使用注解的方式。这两种方式的配置方法都是一样的。

        @BeforeJob:声明作业执行前的操作

        @AfterJob:声明作业执行后的操作

      4.Job Parameters校验    

        Spring Batch框架提供了参数校验的功能。我们可以实现接口org.springframework.batch.core.JobParametersValidator就可以自定义参数校验器,也可以使用框架提供的实现类CompositeJobParametersValidator和DefaultJobParametersValidator分别完成不同的功能。

        CompositeJobParametersValidator:参数校验组合模式,支持一组参数校验。

        DefaultJobParametersValidator:参数校验默认实现,支持必须输入的参数和非必须输入的参数。

        <!-- 验证必输参数jobName和非必输参数path、jobDay -->
        <bean id="myValidator" class="org.springframework.batch.core.job.DefaultJobParametersValidator">
          <property name="requiredKeys">
            <set>
              <value>jobName</value>
            </set>
          </property>
          <property name="optionalKeys">
            <set>
              <value>path</value>
              <value>jobDay</value>
            </set>
          </property>
        </bean>
    
        <batch:job id="firstJob" job-repository="jobRepository">
        <!-- 省略其余步骤 -->
        <batch:validator ref="myValidator"></batch:validator>
      </batch:job>

        接口DefaultJobParametersValidator的源码:

      public class DefaultJobParametersValidator implements JobParametersValidator, InitializingBean {
    
        private Collection<String> requiredKeys;
    
        private Collection<String> optionalKeys;
    
        // 其余省略
      }

      5.Job 抽象与继承    

        Spring Batch框架支持抽象job的定义和Job的继承特性,抽象Job和java中的抽象类相似。抽象的Job不能被实例化,直接调用抽象的Job会报错。定义Job是将abstract设置为true即为抽象Job。

        <batch:job id="baseJob" abstract="true">
          <batch:listeners>
            <batch:listener ref="baseListeners"></batch:listener>
          </batch:listeners>
        </batch:job>

        通过parent属性可以指定当前Job的父Job,子Job继承父Job可以获得父类中所有属性和能力,可以多个Job继承同一个抽象父Job。

      <batch:job id="firstJob" parent="baseJob">
        <!-- 省略其余步骤 -->
        <batch:listeners merge="true">
          <batch:listener ref="myListener"></batch:listener>
        </batch:listeners>
      </batch:job>

        上面firstJob继承了baseJob父类,拦截器merge为true表示firstJob具有baseListeners和myListener两个拦截器的功能,如果merge为false,则子类的拦截器会覆盖掉父类Job中拦截器的功能。

    三、Job的高级特性  

      1.scope    

        scope用来声明IOC容器中对象的存活周期,具体见:https://www.cnblogs.com/whx20100101/p/9807252.html

        Step scope 是Spring Batch 框架提供的自定义的Scope,将Bean的scope=“step”,表示该bean在Step开始的时候初始化,在Step结束的时候销毁bean,
        在Spring Batch框架中,step scope会被自动注册到Spring的上下文中,如果没有使用Spring的配置文件,则需要显示的声明step scope。

        <!-- 显示的声明StepScope --> 
        <bean class="org.springframework.batch.core.scope.StepScope"/>
    
        <!-- 声明bean的scope为step --> 
        <bean id="fileReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"></bean>

        

  • 相关阅读:
    sql查询重复记录、删除重复记录方法大全
    查询字段所在的表/视图
    查询某张表被哪些存储过程或者视图用到的sql语句
    SQL中char、varchar、nvarchar的区别
    JS快速获取图片宽高的方法
    Git代码冲突常见解决方法
    HTML__图片轮播ion-slide-box
    oracle列出两个日期间所有日期
    myeclipse 8.0 注册码
    网页中图片旋转的几种实现方式
  • 原文地址:https://www.cnblogs.com/whx20100101/p/10636351.html
Copyright © 2011-2022 走看看