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的依赖注入来处理批处理的条件. 什么是批处理呢? 在现代企业应用当中,面对复杂的业务以及海量的数据,除 ...
随机推荐
- MySQL查询优化之explain详解
MySQL explain命令显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: ...
- 关于form表单onsubmi提交
表单允许客户端的用户以标准格式向服务器提交数据.表单的创建者为了收集所需数据,使用了各种控件设计表单如 INPUT 或 SELECT.查看表单的用户只需填充数据并单击提交按钮即可向服务器发送数据.服务 ...
- Mac或者linux下登陆到linux上的SFTP
登陆 sftp -i 密钥路径 用户@ip ➜ ~ sftp -i Desktop/aliyun.pem root@39.106.30.1 Connected to 39.106.30.1 上 ...
- 移植最新Uboot到JZ2440开发板
下载最新版U-boot,建立Source Insight工程,在建立工程的时候注意,去掉一些很明显不属于硬件的分支代码. 例如,arch目录下面的除开arm子目录之外的其他目录,都可 ...
- java Enum 类型互转
refer:enum与int.String之间的转换http://www.blogjava.net/wangxinsh55/archive/2012/11/07/390958.html enum< ...
- VCard介绍
91助手和豌豆荚用VCard来存储通讯录,今天调查了一下. 1. 方案 使用VCard存储通讯录,文件扩展名为 vcf, 数据文件可以直接导入IPhone/Windows Phone/android ...
- 内省Introspector(反射操作javaBean)
一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器, 然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的 ...
- 【jmeter】jmeter 压力测试
1.添加线程组,添加CSV Data set config 设置要读取的文件的路径,内容. 指定文件名称,文件编码,变量名,分割符等. 2.添加HTTP请求,注意参数 3.添加监听信息 模拟高并发 , ...
- dubbo开发前戏--ZooKeeper集群部署(3.4.6)
最近在开发dubbo服务的时候一直用的是公司提供的zk平台,因为使用的人太多或者没人维护老是出问题,导致dubbo服务偶尔可以调通,偶尔调不通的情况,所以花点时间自己部署一套,后面出问题还方便看日志排 ...
- 8 -- 深入使用Spring -- 1...3 容器后处理器
8.1.3 容器后处理器(BeanFactoryPostProcessor) 容器后处理器负责处理容器本身. 容器后处理器必须实现BeanFacotryPostProcessor接口.实现该接口必须实 ...