Spring Batch

Spring Batch 是什么?
  是一个基于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());
	}

猜你喜欢

转载自mr-louxi.iteye.com/blog/2353764