spring batch初识

Spring Batch是什么? 

      Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上自己的一些处理规则。因此,要理解Spring Batch的设计和使用,首先需要理解批处理的机制和特点。 
      所谓企业批处理就是指在企业级应用中,不需要人工干预,定期读取数据,进行相应的业务处理之后,再进行归档的这类操作。从上面的描述中可以看出,批处理的整个流程可以明显的分为3个阶段: 
         1、读数据 
         2、业务处理 
         3、归档结果数据 
另外,从定义中可以发现批处理的一个重要特色就是无需人工干预、定期执行,因此一个批处理框架,需要关注事务的粒度,日志监控,执行方式,资源管理,读数据,处理数据,写数据的解耦等方面。 
      SpringBatch为我们提供了什么呢? 
       1、统一的读写接口 
       2、丰富的任务处理方式、 
       3、灵活的事务管理及并发处理 
       4、日志、监控、任务重启与跳过等特性 
注意,Spring Batch未提供关于批处理任务调度的功能,因此如何周期性的调用批处理任务需要自己想办法解决,就Java来说,Quartz是一个不错的解决方案,或者写脚本处理之。

Batch框架整体初见

这种分层结构有三个重要的组成部分:应用层、核心层、基础架构层。应用层包含所有的批处理作业,通过Spring框架管理程序员自定义的代码。核心层包含了Batch启动和控制所需要的核心类,如:JobLauncher、Job和step等。应用层和核心层建立在基础构架层之上,基础构架层提供共通的读(ItemReader)、写(ItemWriter)、和服务(如RetryTemplate:重试模块。可以被应用层和核心层使用)。所以使用spring-batch需引入spring-batch-core.jar和spring-batch-infrastructure.jar(建议2.1.8.RELEASE).

Spring Batch执行流程

         Batch执行流程:外部控制器调用JobLauncher启动一个Job,Job调用自己的Step去实现对数据的操作,Step处理完成后,再将处理结果一步步返回给上一层。其中Job里会配置一次批次处理数量commin-interval,read读一条传给process一条重复这2个操作直到commin-interval最大值就调用一次writer操作。然后再重复上次操作直到处理完所有的数据。当这个Step的工作完成以后,或是跳到其他Step,或是结束处理。

类图介绍

关键类介绍

JobLauncher:接口JobLauncher只有一个子类SimpleJobLauncher.负责整个batch的启动,是入口类。使用run(Jobjob, JobParameters jobParameters)方法,该方法根据JobParameters运行job,其作用就是绑定一组JobParameters到Job上,然后运行该Job。

Job:接口Job有个抽象子类AbstractJob扩展了Job功能的属性,下在有很多子类,其中SimpleJob是我们常用的子类,一个job包含若干step。配置批处理任务的领域对象,该对象的作用,第一是做Step的容器,配置该批处理任务需要的Step,以及他们之间的逻辑关系。第二是配置该批处理任务的特征,比方说名字,是否可重启,是否对JobParameters进行验证以及验证规则等。

Step: 接口Step有个抽象子类AbstractStep扩展了Step功能的属性,下在有很多子类,其中TaskletStep是我们常用的子类,一个Step包含一个Tasklet实例,负责具体的事件。这种形式非常自由,开发人员只需要实现Tasklet接口,其中的逻辑完全有自己决定。另一种是Chunk-Oriented形式的,这种形式定义了一个Step的流程必须是“读-处理(可选)-写”。每一个Step只能由一个Tasklet或者一个Chunk构成。

JobRepository:它会为Spring Batch的运维数据提供一种持久化机制。其为所有的运维数据的提供CRUD的操作接口,并为所有的操作提供事务支持,是存储job及step的仓库。只有一个子类SimpleJobRepository.它有两种存储方式:第一个是通过数据库保存信息,第二个是集合存储。所以当我们使用第一种保存里数据库里要创建对应的表,而对应的表在Jar里有提供sql

而JobRepositoryFactoryBean和MapJobRepositoryFactoryBean都是JobRepository工厂类,JobReository需要注入到jobLauncher,job和step里

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
  <property name="jobRepository" ref="jobRepository"/>
  <property name="taskExecutor" ref="batchThreadPoolExecutor"/>
</bean>
<task:executor id="
batchThreadPoolExecutor" keep-alive="5" thread-pool="50"/>

ItemReader:提供了读取数据的能力,是数据来源,是单行读取数据,有文件读取方式(FlatFileItemReader,必需配置resource和lineMapper两个属性,其它可选配),和数据库读取方式(AbstractPagingItemReader,必需配置参数queryId,sqlMapCLient, dataSource,其它选配)

ItemProcessor:我们可以通过它处理自定义的业务逻辑,完成转换、过滤等操作。数据来自reader的数据,也是单行处理。当处理到size=1000(可以自定义)的时候,批量给writer写操作

ItemWriter:提供了写数据的能力,批量化处理。

注意:

1,jobName不能重复

2,批量name和定时任务name不能重复

3,批量传参的时候key值不能重复,不然会被覆盖

4,定时任务的实例跟批量的实例不能相同

猜你喜欢

转载自www.cnblogs.com/nizuimeiabc1/p/9338165.html