是一个基于Spring和pojo的企业级批处理框架, 所谓企业批处理就是指在企业级应用中,不需要人工干预,定期读取数据,进行相应的业务处理之后,再进行归档的这类操作。
Spring Batch 能干什么?
目前只是用spring-batch来跑批(不需要人工干预,只需要定期读入大批量数据,然后完成相应业务处理并进行归档)
Spring Batch 学习前理解:
Spring Batch 很大程度上是对一个任务进行代码结构上的解耦,把一个完成的java程序(task)拆分成3部分:读取数据(Reader)--处理数据(Processor)--写数据(Write) 这3步组成一个完整的任务单元 称为Step ,而一个完整的java程序程序(task)可能是由一个 或者多个Step组成
Spring Batch 是如何干活的呢?
所有写好的job 会存储在JobLauncher 这个仓库中, job中 真正干事的是step 想让step干活 你就需要给step一些工具 itemReader,ItemProcessor,itemWriter就是它需要的工具,这些工具可以是你自己提供,以可以用spring batch现成的。完了之后 再通过JobLauncher去运行你需要的job.
Spring Batch demo:(项目基于spring-boot,和Maven)
1. 只介绍项目是基于Maven 的需要加入 springBatch相关的依赖包(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency>
2.下面介绍主要是基于xml配置job的形式,所以需要在 springBoot 的application.properties文件中加入 job任务解析路径
# spring batch spring.batch.job.enabled=false spring.batch.job.names=job
3.配置一个简单的job(test-job.xml由于上一步中给定了 job的路径 所以该文件需要创建在job文件夹下),这个job的xml里面需要注意的是 在用sql 查询的时候 需要注入数据源
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <job id="T-job" xmlns="http://www.springframework.org/schema/batch"> <step id="step1" next="step2"> <tasklet > <chunk commit-interval="5" reader="T-itemReader" processor="T-itemProcessor" writer="T-itemWriter" /> </tasklet> </step> <step id="step2"> <tasklet> <chunk commit-interval="5" reader="T-itemReader" processor="T-itemProcessor" writer="T-itemWriter" /> </tasklet> </step> </job> <bean id="T-itemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> <property name="dataSource" ref="dataSource" /> <property name="rowMapper" ref="studentMapper"/> <property name="sql"> <value> <![CDATA[ select * from TEST_STU ]]> </value> </property> </bean> <bean id="studentMapper" class="com.coshine.unifiedpay.test.StudentRowMapper"> <property name="student" value="com.coshine.unifiedpay.test.Student"/> </bean> <bean id="T-itemProcessor" class="com.coshine.unifiedpay.test.TestProcessor" /> <bean id="T-itemWriter" class="com.coshine.unifiedpay.test.TestWriter" > <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> </beans>
4.上面用的工具(ItemProcessor,itemWriter 都是手动创建的 其中JdbcCursorItemReader 是 springbatch自己提供)StudentRowMapper.java
package com.coshine.unifiedpay.test; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import org.springframework.jdbc.core.RowMapper; public class StudentRowMapper implements RowMapper<Map<String,Object>> { private Student student; @Override public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException { // TODO Auto-generated method stub Map<String,Object> map = new HashMap<String,Object>(); student.setStuid(rs.getString("STUID")); student.setStuname(rs.getString("STUNAME")); student.setStuage(rs.getString("STUAGE")); student.setChecknum(rs.getString("CHECKNUM")); map.put("stuObj", student); return map; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } }
5.TestProcessor .java
package com.coshine.unifiedpay.test; import org.springframework.batch.item.ItemProcessor; public class TestProcessor implements ItemProcessor<String, Object>{ @Override public Object process(String str) throws Exception { System.err.println("-------------进入TestProcessor------------"); return new Object(); } }
6.TestWriter.java 这个里面用到了 jdbcTemplate 但由于该类没有通过注解加入到容器 不能直接通过注解将jdbcTemplate对象注入到该类中 所以引用了 spring中注入bean 的方式 在TestWriter这个bean 里面添加jdbcTemplate 属性 再通过set方法注入进来
package com.coshine.unifiedpay.test; import java.util.List; import org.springframework.batch.item.ItemWriter; import org.springframework.jdbc.core.JdbcTemplate; public class TestWriter implements ItemWriter<Object>{ private JdbcTemplate jdbcTemplate; @Override public void write(List<? extends Object> list) throws Exception { System.err.println("------------进入TestWrite--------------"+list); } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }
7.运行job
那么我们如何去运行一个Spring batch 任务呢?
1.SpringBatch 下的所有任务 都是存储在JobLauncher 中的 那么运行一个job 就需要通过JobLauncher去调用对应的job
2.对于基于注解的 spring boot 项目 我们只需要 注入
@Autowired JobLauncher jobLauncher;
3.参考
@Controller @RequestMapping("/test") public class TestController { @Autowired JobLauncher jobLauncher; @Autowired ListableJobLocator jobLocator_; @RequestMapping("/jobs") @ResponseBody public void TestJob() throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, NoSuchJobException{ JobParameters jp = new JobParameters(); JobParameters jp2 =new JobParametersBuilder().addString("date", System.currentTimeMillis() + "").toJobParameters(); JobExecution execution = jobLauncher.run(jobLocator_.getJob("T-job"), jp2); System.out.println("Exit Status : " + execution.getStatus()); }