【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
Spring Batch是由spring提供的批处理组件,官方文档见http://projects.spring.io/spring-batch/
batch主要的组成如下图:
JobLauncher是用于加载执行job以及传递JobParameters参数等,Job的接口每个任务job包括多个step,每个step之间又包括ItemReader(读取数据)、ItemProcessor(处理每条数据相关逻辑)、ItemWriter(批量写入数据);各个节点通过JobRepository协调事务、执行状态等。
每个step的执行流程如下图:
上图为同步执行流程,batch还提供异步方式,详细可见官方文档。
简单的实现:
1、引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
</dependencies>
2、配置job相关信息
<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>
3、实现类
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; } }
4、启动job
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