Spring Batch是由spring提供的批处理组件,官方文档见http://projects.spring.io/spring-batch/spring
batch主要的组成以下图:app
JobLauncher是用于加载执行job以及传递JobParameters参数等,Job的接口每一个任务job包括多个step,每一个step之间又包括ItemReader(读取数据)、ItemProcessor(处理每条数据相关逻辑)、ItemWriter(批量写入数据);各个节点经过JobRepository协调事务、执行状态等。less
每一个step的执行流程以下图:异步
上图为同步执行流程,batch还提供异步方式,详细可见官方文档。ide
简单的实现:测试
一、引入相关依赖ui
<dependencies> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-core</artifactId> <version>3.0.7.RELEASE</version> </dependency> </dependencies>
二、配置job相关信息this
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository"/> </bean> <!-- 用于测试,job的相关状态都保存在内存中 --> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> </bean> <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
<bean:import resource="spring-application.xml"/> <job id="helloJob"> <step id="first_step" next="end_step"> <tasklet ref="firstTasklet" transaction-manager="transactionManager" /> </step> <step id="end_step"> <tasklet ref="endTasklet" transaction-manager="transactionManager" /> </step> </job> <bean:bean id="firstTasklet" class="com.test.batch.simple.tasklet.FirstTasklet"> <bean:property name="message" value="hello spring batch" /> </bean:bean> <bean:bean id="endTasklet" class="com.test.batch.simple.tasklet.EndTasklet"> <bean:property name="message" value="bye spring batch" /> </bean:bean>
三、实现类code
public class FirstTasklet implements Tasklet { private String message; public void setMessage(String message) { this.message = message; } @Override public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception { System.out.println(message + ",first tasklet"); return RepeatStatus.FINISHED; } }
public class EndTasklet implements Tasklet { private String message; public void setMessage(String message) { this.message = message; } @Override public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception { System.out.println(message + ",end tasklet"); return RepeatStatus.FINISHED; } }
四、启动jobxml
public class HelloJobLaunch { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-batch-simple.xml"); JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher"); Job job = (Job) context.getBean("helloJob"); try { // 运行Job JobExecution result = launcher.run(job, new JobParametersBuilder() .toJobParameters()); // 处理结束 System.out.println(result.getExitStatus().toString()); } catch (Exception e) { e.printStackTrace(); } } }
其中Tasklet是一种特殊的step,区别于reader、processor、writer所组成的step