内容来自《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>

    

spring batch (四) Job的配置及配置文件说明介绍的更多相关文章

  1. Spring学习四----------Bean的配置之Bean的配置项及作用域

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...

  2. spring的四种数据源配置

     DriverManagerDataSource   spring自带的数据源,配置如下: <bean id="dataSource" class="org.spr ...

  3. Windows下Nginx的配置及配置文件部分介绍

    一.在官网下载 nginx的Windows版本,官网下载:http://nginx.org/download/ 选择你自己想要的版本下载,解压 nginx(例如nginx-1.6.3) 包到你的win ...

  4. Spring Boot整合Spring Batch

    引言 Spring Batch是处理大量数据操作的一个框架,主要用来读取大量数据,然后进行一定的处理后输出指定的形式.比如我们可以将csv文件中的数据(数据量几百万甚至几千万都是没问题的)批处理插入保 ...

  5. Spring Batch 批处理框架

    <Spring Batch 批处理框架>基本信息作者: 刘相 出版社:电子工业出版社ISBN:9787121252419上架时间:2015-1-24出版日期:2015 年2月开本:16开页 ...

  6. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

  7. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  8. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  9. Spring Cloud构建微服务架构(四)分布式配置中心

    Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对Spring Environm ...

随机推荐

  1. Mac新系统常用设置

    一.MAC OS整个系统的隐藏文件显示可见,在终端下输入以下命令defaults write com.apple.finder AppleShowAllFiles -bool true 二. 在MAC ...

  2. Eclipse安装git插件以及关联导入GitHub项目

    一.Eclipse配置git 1.查看自己eclipse的版本 打开eclipse 导航: help->AboutEclipse 如图: 2.检查Eclipse中是否已安装Git插件 菜单栏He ...

  3. 金蝶k/3 K3云之家消息查询发送是否成功SQL语句

    金蝶k/3 K3云之家消息查询发送是否成功SQL语句 1是成功,0是还在轮询中未发送,4是发送失败 select * into #tempUserID from ( union select t_Gr ...

  4. 如何手写Ajax实现异步刷新

    所谓的异步刷新,就是不刷新整个网页进行更新数据. 只有通过js才能实现Ajax,进而实行异步刷新 表单提交数据和Ajax提交数据的区别:表单提交是提交的整个页面中的数据,提交数据之后会抛弃之前的页面( ...

  5. linux(CentOS)磁盘挂载数据盘

    linux(CentOS)磁盘挂载数据盘:第一步:查看是否存在需要挂载的磁盘: sudo fdisk -l 第二步:为需要挂载的磁盘创建分区: sudo fdisk /dev/vdb 执行中:依次选择 ...

  6. DWM1000 测距原理简单分析 之 SS-TWR代码分析2 -- [蓝点无限]

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 首先将SS 原理介绍中的图片拿过来,将图片印在脑海里. 对于DeviceA 和 DeviceB来说,初 ...

  7. JavaScript(四)

    条件语句 通过条件来控制程序的走向,就需要用到条件语句. 运算符 1.算术运算符: +(加). -(减). *(乘). /(除). %(求余)2.赋值运算符:=. +=. -=. *=. /=. %= ...

  8. vue_过渡_动画

    过渡效果 <style> .xxxx-enter-active,         // 显示过渡 .xxxx-leave-active {        // 隐藏过渡 transitio ...

  9. java反射机制的简单使用

    java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...

  10. Java正则表达式过滤并消除非法字符

    package sd; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author 大汉 * */ ...