SpringBatch——初识批处理

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());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值