SpringBatch批处理
每个作业Job有1个或者多个作业步Step;
每个Step对应一个ItemReader、ItemProcessor、ItemWriter
Job Launcher发射器启动Job,从JobRepository中获取存在的Job Execution
当前运行的Job及Step的结果及状态会保存在JobRepository中
SpringBatch主要领域对象:
Job 作业,批处理操作的基础单元。
Job Instance 作业实例,执行时存放在JobRepository,如果作业失败,下次重新执行使用同一个实例
Job Parameters 作业参数,一组用来启动批处理的参数,根据参数区分不同的实例
Job Exception 作业执行器,每次运行Job都会启动一个新的Job执行器
Job Repository 作业仓库,存储作业执行过程中的状态数据及结果,为JobLauncher,Job,Step提供标准的CRUD实现
Job Launcher 作业调度器,根据给定的作业参数执行作业
Step 作业步,多个或者一个组装成Job,封装了批处理任务中的一个独立连续阶段
Step Execution 作业步执行器,负责具体的Step执行,每次运行都会启动一个新的执行器
Tasklet 属于Step具体执行逻辑的操作,可以重复执行,可以设置具体的同步、异步操作等
Execution Context 执行上下文,key/value,保存持久化的状态
Item 一条记录记录
Chunk 记录的集合,可以对应对该集合的读写操作,提交间隔。
Item Reader 条目读,一次读取一条
Item Processor 条目处理
Item Writer 条目写,一次输出一批
开发环境搭建
SpringBatch官网 http://projects.spring.io/spring-batch
下载地址 http://static.springsource.org/downloads/nightly/release-download.php?project=BATCH
解压压缩目录spring-batch-xxx.RELEASE-no-dependencies.zip
批处理应用
一、创建maven项目
二、csv文件(信用卡消费清单文件)
银行账户,持卡人姓名,消费金额,消费日期,消费地点
三、CreditBill类
//映射csv文件
public class CreditBill{
private String accountID = "";
private String name = "";
private double amount = 0;
private String date;
privae String address;
}
四、job.xml
<bean:import resource="classpath:job-context.xml"/>
<!--配置ItemReader,读取文本文件中的数据,并转换为信用卡对账单对象CreditBill-->
<bean:bean id="csvItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scopt="step">
<!--要读取的文件资源-->
<bean:property name="resource" value="classpath:/credit-cart-bill-xx.csv"/>
<!--可以把文本中的一行转换为领域对象Creditbill-->
<bean:property name="lineMapper">
<bean:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<bean:property name="lineTokenizer" ref="lineTokenizer"/>
<bean:property name="fieldSetMapper">
<bean:bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieledSetMapper">
<bean:property name="prototypeBeanName" value="creditBill"/>
</bean:bean>
<bean:property>
</bean:bean>
</bean:property>
</bean:bean>
<!--定义文本中每行的分隔符号,以及每行映射成FieldSet对象后的name列表-->
<bean:bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<bean:property name="delimiter" value=","/>
<bean:property name="names">
<bean:list>
<bean:value>accountId</bean:value>
<bean:value>name</bean:value>
<bean:value>amount</bean:value>
<bean:value>date</bean:value>
<bean:value>address</bean:value>
</bean:list>
</bean:property>
</bean:bean>
<!--配置ItemProcessor-->
<bean:bean id="creditBillProcessor" scope="step" class="com.michael.CreditBillProcessor">
</bean:bean>
<!--配置csvItemWriter-->
<bean:bean id="csvItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<!--需要写入的文件资源-->
<bean:property name="resource" value="file:target/outputFile.csv"/>
<!--将信用卡账单对象根据定义的规则转换为一个文本-->
<bean:property name="lineAggregator">
<bean:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<bean:property name="delimiter" value=","></bean:property>
<bean:property name="fieldExtractor">
<bean:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<bean:property name="names" value="accountID,name,amount,date,address">
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
<!--定义作业billJob
作业名为billStep由step组成
-->
<job id="billJob">
<step id="billStep">
<tasklet transaction-manager="transactionManager">
<!--定义读写操作
处理每一行数据
提交间隔,每处理2条数据,进行一次写入操作,如果大数据量可以设置为1000~10000
-->
<chunk reader="csvIntemReader" writer="csvItemWriter" processor="creditBillProcessor" commit-interval="2"></chunk>
</tasklet>
</step>
</job>
/**
处理csvItemReader读取的数据,并将处理后的数据返回,被ItemWriter处理
*/
public class CreditBillProcessor implements ItemProcessor<CreditBill,CreditBill>{
public CreditBill process(CreditBil bill) throws Exception{
System.out.println(bill.toString());
return bill;
}
}
五、job-context.xml
Spring配置文件中定义批处理任务
<!--作业仓库,记录任何任务的操作。以下两种仓库
1.内存 (本例采用)
2.数据库
-->
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"/>
<!--作业调度器,用来启动Job-->
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository">
</bean>
<!--事务管理器,对数据操作提供事务能力-->
<bean id="transactionManager" clss="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
六、Java调用
//传入任务定义文件job.xml获取Spring上下文
ApplicationContext context = new ClassPathXmlApplicationContext("/job.xml");
//获取作业调度器
JobLauncher launcher = (JobLaucher)context.getBean("jobLauncher");
//获取名字为billJob任务对象
Job job = (Job)context.getBean("billJob");
try{
//通过作业调度器执行任务
JobExecution result = launcher.run(job.new JobParameters());
System.out.println(result.toString());
}catch(Exception e){
e.printStackTrace();
}
调用之后,写入outputFile.csv文件
单元测试
@RunWith(SpringJUnit4ClassRunner.class) //该测试用例是运用junit4
@ContextConfig(locations={"/job.xml"}) //设置Spring上下文加载文件的路径
public class JobLaunchTest{
@Autowired
private JobLauncher jobLauncher;
@Autowired@Qualifier("billJob") //手动指定装配对象的bean id
private Job job;
@Before
public void setUp() throws Exception{}
@After
public void tearDown() throws Exception{}
@Test
public void importProducts() throws Exception{
//作业调度器,调用批处理作业任务
JobExecution result = jobLauncher.run(job,new JobParameters());
System.out.println(result.toString());
}
}