java springbatch简介与helloworld

一、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">
		<property name="jobRepository" ref="jobRepository" />
	</bean>

	<bean id="jobRepository" />

	<bean id="transactionManager" />
</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">
		<bean:property name="message" value="Hello "></bean:property>
	</bean:bean>

	<bean:bean id="world">
		<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的一些参数, 处理结束后控制台输出处理结果。
转自:http://www.cnblogs.com/gulvzhe

Tagged: ,

Comments are closed.