springbatch---->springbatch的使用(七)
这里我们讲述一下springbatch中关于step层面上面的数据共享技术。而对街的人影都浸染在一片薄荷的白色中,由于无声,都好像经过漂染,不沾人间烟火。
step的数据共享
关于springbatch里面的step的数据共享,可以有很多的实现方式。比如可以用数据库记载共享的数据、文件保存共享的数据等等。这里我们重点讨论的是springbatch与spring可以解决这类问题的方案。总的来说,可以有如下两种方式。
Execution context
Use a Spring Batch execution context as a container for user data. A step writes to the execution context; then another step reads from the execution context.
Holder
Use a Spring bean and dependency injection. Spring injects a holder bean in the communicating beans. A first step sets values in the holder; another step reads values from the holder.
下面我们针对这同种方式做一个测试的案例。
一、使用Execution context方式共享数据
- 定义一个job,在batch.xml里面
<job id="shareDataContextJob">
<step id="setDateStep" next="getDateStep">
<tasklet transaction-manager="transactionManager" ref="setDataContextTasklet"/>
</step>
<step id="getDateStep">
<tasklet transaction-manager="transactionManager" ref="getDataContextTasklet"/>
</step>
</job>
- setDataContextTasklet与getDataContextTasklet的定义
<bean id="setDataContextTasklet" class="spring.batch.shareDataContext.SetDataContextTasklet"/>
<bean id="getDataContextTasklet" class="spring.batch.shareDataContext.GetDataContextTasklet"/>
- setDataContextTasklet与getDataContextTasklet的实现
存放数据的实现类
package spring.batch.shareDataContext; import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus; /**
* @Author: huhx
* @Date: 2017-11-02 下午 8:41
*/
public class SetDataContextTasklet implements Tasklet { @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
ExecutionContext jobExecutionContext = chunkContext.getStepContext().
getStepExecution().
getJobExecution().
getExecutionContext();
jobExecutionContext.putString("username", "huhx");
System.out.println("set data tasklet.");
return RepeatStatus.FINISHED;
}
}
得到数据的实现类
package spring.batch.shareDataContext; import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus; /**
* @Author: huhx
* @Date: 2017-11-02 下午 8:41
*/
public class GetDataContextTasklet implements Tasklet { @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
ExecutionContext jobExecutionContext = chunkContext.getStepContext().
getStepExecution().
getJobExecution().
getExecutionContext();
String username = jobExecutionContext.getString("username");
System.out.println("username = " + username);
return RepeatStatus.FINISHED;
}
}
运行的结果,setDateStep得到的getDateStep存放的数据。
set data tasklet.
username = huhx
另外我们还有另外一种写法。在基于上述的代码做如下的修改:getDataContextTasklet和定义与实现。注意scope="step"是必须的。
<bean id="getDataContextTasklet" class="spring.batch.shareDataContext.GetDataContextTasklet" scope="step">
<property name="username" value="#{jobExecutionContext['username']}"/>
</bean>
getDataContextTasklet的实现类,可以直接注入username得到setDataContextTasklet里面设置的username值。
package spring.batch.shareDataContext; import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus; /**
* @Author: huhx
* @Date: 2017-11-02 下午 8:41
*/
public class GetDataContextTasklet implements Tasklet {
private String username; public void setUsername(String username) {
this.username = username;
} @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("username = " + username);
return RepeatStatus.FINISHED;
}
}
二、通过Spring holder beans共享数据
- 定义一个job,在batch.xml中
<job id="shareDataHolderJob">
<step id="setDateHolderStep" next="getDateHolderStep">
<tasklet transaction-manager="transactionManager" ref="setDataHolderTasklet"/>
</step>
<step id="getDateHolderStep">
<tasklet transaction-manager="transactionManager" ref="getDataHolderTasklet"/>
</step>
</job>
- setDataHolderTasklet、getDataHolderTasklet以及共享数据Bean类的定义
<!--通过holder分享数据-->
<bean id="importMetadata" class="spring.batch.shareDataHolder.ImportMetadataHolder"/>
<bean id="setDataHolderTasklet" class="spring.batch.shareDataHolder.SetDataHolderTasklet">
<property name="importMetadataHolder" ref="importMetadata"/>
</bean> <bean id="getDataHolderTasklet" class="spring.batch.shareDataHolder.GetDataHolderTasklet">
<property name="importMetadataHolder" ref="importMetadata"/>
</bean>
- 上述xml定义的bean类的实现
ImportMetadataHolder:共享数据Bean类。
package spring.batch.shareDataHolder; import spring.batch.readFile.People; /**
* @Author: huhx
* @Date: 2017-11-03 上午 8:56
*/
public class ImportMetadataHolder {
private People people; public People getPeople() {
return people;
} public void setPeople(People people) {
this.people = people;
}
}
SetDataHolderTasklet:设置共享数据的实现类
package spring.batch.shareDataHolder; import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import spring.batch.readFile.People; import java.util.Date; /**
* @Author: huhx
* @Date: 2017-11-03 上午 9:00
*/
public class SetDataHolderTasklet implements Tasklet {
private ImportMetadataHolder importMetadataHolder; public void setImportMetadataHolder(ImportMetadataHolder importMetadataHolder) {
this.importMetadataHolder = importMetadataHolder;
} @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
People people = new People();
people.setUsername("huhx");
people.setBirthday(new Date());
people.setAddress("武汉");
people.setAge(23);
importMetadataHolder.setPeople(people);
return RepeatStatus.FINISHED;
}
}
GetDataHolderTasklet:获取共享数据的实现类
package spring.batch.shareDataHolder; import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus; /**
* @Author: huhx
* @Date: 2017-11-03 上午 9:00
*/
public class GetDataHolderTasklet implements Tasklet {
private ImportMetadataHolder importMetadataHolder; public void setImportMetadataHolder(ImportMetadataHolder importMetadataHolder) {
this.importMetadataHolder = importMetadataHolder;
} @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println(importMetadataHolder.getPeople());
return RepeatStatus.FINISHED;
}
}
运行的结果,在控制台打印:
username=huhx|age=|address=武汉|birthday=Fri Nov :: CST
之所以ImportMetadataHolder类能够共享,是由于spring中Bean的默认scope是singleton单例的。如果修改scope为prototype。那么输出的结果为null。
另外这种方式也可以使用SpEL表达式的方式来注入要共享的数据。修改getDataHolderTasklet的定义和实现类以及修改importMetadata的scope=singleton。如下
<bean id="getDataHolderTasklet" class="spring.batch.shareDataHolder.GetDataHolderTasklet" scope="step">
<property name="username" value="#{importMetadata.getPeople().getUsername()}"/>
</bean>
GetDataHolderTasklet可以直接注入username,打印它的结果为huhx。这里就不贴出代码。
友情链接
springbatch---->springbatch的使用(七)的更多相关文章
- YII内置验证规则
required: 必填字段验证, 来自 CRequiredValidator类的别名 array(‘字段名列表用逗号隔开’, ‘required’), 就这样的一个小小的写法,可以让字段前面加 ...
- Spring Batch介绍
简介 SpringBatch 是一个大数据量的并行处理框架.通常用于数据的离线迁移,和数据处理,⽀持事务.并发.流程.监控.纵向和横向扩展,提供统⼀的接⼝管理和任务管理;SpringBatch是Spr ...
- SpringBoot整合SpringBatch
一.引入依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...
- springbatch操作CSV文件
一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...
- SpringBatch的核心组件JobLauncher和JobRepository
Spring Batch的框架包括启动批处理作业的组件和存储Job执行产生的元数据.因此只需掌握配置这个基础框架在批处理应用程序中即启动Jobs并存储Job元数据. 组件:Job Launcher和J ...
- SpringBatch简介
spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...
- spring-boot-oracle spring-batch
Install/Configure Oracle express Oracle xe installer for linux (I don't care if you're running linux ...
- springbatch的封装与使用
springbatch 主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可.Spring Batch 不仅提供了统一的读写接口.丰富的任务处理方式.灵 ...
- SpringBatch的流程简介
SpringBatch的流程图如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器装了若干Step,Batch中实际干活的也就是这些Step,至于Step干什么活,无外乎读取数据,处 ...
- SpringBatch的初步了解
一.SpringBatch是一个批处理的框架,作为一个Spring组件,提供了通过使用Spring的依赖注入来处理批处理的条件. 什么是批处理呢? 在现代企业应用当中,面对复杂的业务以及海量的数据,除 ...
随机推荐
- CI框架 -- 核心文件 之 config.php
Config:该文件包含CI_Config类,这个类包含启用配置文件来管理的方法 /** * 加载配置文件 * * @param string $file 配置文件名 * @param bool $u ...
- 如何使用Matrix对bitmap的旋转与镜像水平垂直翻转
Bitmap convert(Bitmap a, int width, int height){int w = a.getWidth();int h = a.getHeight();Bitmap ne ...
- PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法
CDM是概念模型,在概念模型上没有具体数据库产品的概念,反映的是实体和联系.PDM是物理模型,是依赖具体数据库产品的模型,比如可以指定具体的数据类型和约束等等.在PowerDesigner中两个模型之 ...
- 测试webservice的时候,如果出现这个错误:"The test form is only available for requests from the local machine"
测试webservice的时候,如果出现这个错误:"The test form is only available for requests from the local machine&q ...
- java 散列
原文:https://www.cnblogs.com/younghao/p/8333795.html 为什么要设计散列这种数据结构呢?在现实世界中,实体之间可能存在着映射关系(key-value),比 ...
- 腾讯游戏设计(tgideas.qq.com)回复处CSRF任意换马甲
http://tgideas.qq.com GET /cgi-bin/comments/sendreply.cgi?iActivId=1&iSubActivId=215722&iPar ...
- 使用FileZilla解决从Windows上传文件到Linux vsftpd的乱码问题!
日前将golang的开发环境从windows转移到了CentOS6上,为了把以前写得项目代码上传到centos,架设了vsftpd服务,设置为本地用户登录,然后用惯用的ftp软件flashfxp上传了 ...
- 杨涛老师MvcPager示例
杨涛老师插件地址:http://www.webdiyer.com/mvcpager 杨涛老师网站上示例写的很详细了,参考他的示例和帮助文档就可以运用的很好了,有经验的同学可以直接参考官方示例. 一.标 ...
- 常用Linq示例代码
class Program { static void Main(string[] args) { //1. Aggregate int[] testArr = new int[] { 1, 2, ...
- Ognl_JSTL_学习笔记
控制标签 使用Struts2标签必须先导入标签库,在页面使用如下代码导入Struts2标签:<%@taglib prefix="s" uri="/struts-ta ...