这篇先对Spring Batch 做个基本的介绍
现在企业业务中需要在关键任务中需要进行对大量数据的操作,这些业务操作包括自动化的,复杂的处理的大量的信息,这些操作就被称为批处理。
Spring Batch是一个轻量级的、全面的批处理框架,旨在使开发健壮的批处理应用程序对企业系统的日常操作至关重要。
Spring Batch提供了大量可重用的组件,包括日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理。对于大数据量和高性能的批处理任务,Spring Batch同样提供了高级功能和特性来支持,比如分区功能、远程功能。总之,通过Spring Batch 能够支持简单的、复杂的和大数据量的批处理作业。
Spring Batch 3.0 主要新特性
- JSR-352 Support
- Upgrade to Support Spring 4 and Java 8
- Promote Spring Batch Integration to Spring Batch
- JobScope Support
- SQLite Support
JavaConfig 配置是在 2.2版本就已经支持了的。
SpringBatch 架构
Spring Batch核心架构分为三层:应用层、核心层、基础架构层。
应用层包含所有的批处理作业,通过Spring框架管理程序员自定义的代码。核心层包含Spring Batch启动和控制所需要的核心类,如:JobLauncher、Job和step等。应用层和核心层建立在基础构架层之上,基础构架层提供通用的读(ItemReader)、写(ItemWriter)和服务处理(如:RetryTemplate:重试模板;RepeatTemplate:重复模板,可以被应用层和核心层使用)。Spring Batch的三层体系架构使得Spring Batch框架在不同的层级进行扩展,避免不同层级间的影响。
开箱即用的组件
读:支持文本文件读、XML文件读、数据库读,JMS队列读。
写:支持写文本文件、XML文件、数据库、JMS队列。
该组件还提供作业仓库、作业调度器等基础设施,大大简化了批处理应用开发的复杂度。
可查看ItemReader 和 ItemReader 这两个接口的实现类等。
还有许多的特性等用到再详细说明。
- Job : 作业本身, 多个或一个Step组合一个Job
- Step: 作业步Job 执行的一个环节,每个step都有 Reader Proccessor Writer的操作
- ItemReader: 读取信息的操作,可以从数据库或者文件中读取数据交给processor处理
- ItemProcessor:处理数据的操作,接受读操作传递的数据进行处理再传递给写操作
- ItemWriter:写操作,将处理过的信息写入数据库或者文件中等
- JobLauncher:用来启动一个job
- JobRepository:存储spring batch的元数据
上面这张图很重要,基本上我们需要操作的都包含在了上面这张图上面。
Job 看起来是 Steps 的简单的容易,其中可以包含多个Step,在Job中有很多需要知道的配置,例如如何让Job 启动,如何在它运行的时候存储它的元数据。
Spring 2.2 支持 Java Config 来配置Batch
新增了 @EnableBatchProcessing 注解 和 两个工厂类 分别是JobBuilderFactory 和StepBuilderFactory
通过 @EnableBatchProcessing 注解(这是一个类注解),StepScope 的实例被创建,并且使下列的bean都可以被自动注入
- JobRepository - bean name “jobRepository”
- JobLauncher - bean name “jobLauncher”
- JobRegistry - bean name “jobRegistry”
- PlatformTransactionManager - bean name “transactionManager”
- JobBuilderFactory - bean name “jobBuilders”
- StepBuilderFactory - bean name “stepBuilders”
下面是一个简单的示例
@Configuration //声明为配置类
@EnableBatchProcessing
//在配置类中激活spring batch 的特性 并且提供基本的配置来建立批处理任务
@Import(DataSourceConfiguration.class)
//导入数据源配置
public class AppConfig {
//以下两个引用因为类上配置了@EnableBatchProcessing所以可以自动注入
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
//@Bean 是Java Config(一个Spring 的子项目)的注解 相当于xml配置的<bean />标签
@Bean
public Job job(@Qualifier("step1") Step step1, @Qualifier("step2") Step step2) {
//从job共享类中得到一个名字为"my job"的任务,开启任务步Step1
return jobs.get("myJob").start(step1).next(step2).build();
}
//任务步1的配置 step配置会在后面提到
@Bean
protected Step step1(ItemReader<Person> reader, ItemProcessor<Person, Person> processor, ItemWriter<Person> writer) {
return steps.get("step1")
.<Person, Person> chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
//Tasklet 是Step中具体执行逻辑的操作,可以设置重复执行, 同步/异步等。
@Bean
protected Step step2(Tasklet tasklet) {
return steps.get("step2")
.tasklet(tasklet)
.build();
}
}
示例来自于 Spring Batch doc
http://docs.spring.io/spring-batch/trunk/reference/html/index.html