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