一、SpringBatch简介
Spring Batch是一个轻量级的批处理框架, 可以用于企业级海量数据处理, 它提供以下技术解决方案:
1. 定时批处理
2. 大规模并行处理
3. 企业消息驱动处理
二、SpringBatch结构
Spring Batch由应用层、核心层、基础架构层等组成:
1. 应用层: 包含所有的批处理作业, 使用spring框架管理程序员自定义的代码
2.核心层: 包含batch启动和控制所需要的核心类, 如: JobLauncher、Job、Setp等
3.基础架构层: 提供共通的读(ItemReader)、写(ItemWriter)和服务(RetryTemplate)
应用层和核心层简历在基础架构层之上, 下图展示了它们之间的关系:
三、SpringBatch流程
1. spring batch执行过程:
外部控制器调用JobLauncher启动一个Job, 每个batch都会包含一个Job, Job就像一个容器, 这个容器里装了若干个Setp,
batch里面真正干活的就是这些Setp(ItemReader用来读取数据,ItemProcessor用来处理数据,ItemWriter用来写数据),
Job调用Step实现对数据的操作, Setp处理完成后, 将处理结果一步步返回给上一层。
JobRepository是上述处理提供的一种持久化机制, 它为JobLauncher、Job、Setp实例童工CRUD操作。
2. Step执行过程:
从DB或文件中取出数据的时候, read操作每次只读取一条记录, 然后将这条数据传递给processor处理, batch框架将重复做这两步操作,
直到读取记录的数量达到配置文件中"commin-interval"设定值得时候就会调用一个write操作, 然后再重复以上操作, 直到处理完所有的
数据。当这个Setp工作完成以后可以调到其他Setp或结束处理。
四、HelloWorld实例
本实例没有像前面讲的那样配置ItemReader、ItemProcessor、ItemWriter,而是直接在Setp中调用Tasklet
由Tasklet完成"Hello World!"的输出。
1. 工程结构图:
2. applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-autowire="byName">
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" />
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
</beans>
applicationContext.xml主要用来配置一些spring信息, JobLaunch类用来启动Batch
3. springBatch.xml
<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/batch"
xmlns:bean="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">
<!-- 装载spring核心配置文件 -->
<bean:import resource="applicationContext.xml" />
<job id="helloWorldJob">
<step id="step_hello" next="step_world">
<tasklet ref="hello" transaction-manager="transactionManager"></tasklet>
</step>
<step id="step_world">
<tasklet ref="world" transaction-manager="transactionManager"></tasklet>
</step>
</job>
<bean:bean id="hello" class="com.zdp.springbatch.WriteTasklet">
<bean:property name="message" value="Hello "></bean:property>
</bean:bean>
<bean:bean id="world" class="com.zdp.springbatch.WriteTasklet">
<bean:property name="message" value=" World!"></bean:property>
</bean:bean>
</bean:beans>
springBatch.xml配置了一个ID为helloWorldJob的Job,这个Job有两个Setp:setp_hello和setp_world,
前者负责输出“Hello ”, 后者负责输出“World!”,当第一个Setp完成之后执行第二个Setp。
4. WriteTasklet:
public class WriteTasklet implements Tasklet {
private String message;
/**
* @param message
* the message to set
*/
public void setMessage(String message) {
this.message = message;
}
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext)throws Exception {
System.out.println(message);
return RepeatStatus.FINISHED;
}
}
WriteTasklet中定义了一个message属性,通过springBatch.xml的hello和world bean为其注入值,execute方法由Tasklet接口继承而来,
是Tasklet实现业务逻辑的地方,此实例只是简单的输出message信息后直接返回。
5. JobLaunch
/**
* Test client
*/
public class JobLaunch {
public static void main(String[] args) {
try {
ApplicationContext context = new ClassPathXmlApplicationContext("springBatch.xml");
JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("helloWorldJob");
// JobLauncher可以用来启动Job
JobExecution result = jobLauncher.run(job, new JobParameters());
// 处理结束,控制台打印处理结果
System.out.println(result.toString());
} catch (Exception e) {
throw new RuntimeException("error happens...", e);
}
}
}
通过spring配置取得JobLauncher和Job对象,然后由JobLauncher的run方法启动Job,JobParameters是标志Job的一些参数,
处理结束后控制台输出处理结果。