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的依赖注入来处理批处理的条件. 什么是批处理呢? 在现代企业应用当中,面对复杂的业务以及海量的数据,除 ...
随机推荐
- Linq“条件排序”
StockQuantities.OrderBy(u=>u.Status==null) 该排序先排结果为0(false)的,再排结果为1(true)的 使用场景: 一个对象有上传时间(可以为空)和 ...
- Centos7 安装redis服务
Redis的安装 1.先安装gcc编译器,否则make的时候会报错 yum -y install gcc 2.下载redis安装包,解压编译安装 $ wget http://download.redi ...
- JavaScript对数组的处理(一)
数组创建 JavaScript中创建数组有两种方式,第一种是使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组 var arr2 = new Array( ...
- Java多线程之细说线程池
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
- css 边框使用
https://www.cnblogs.com/luka/p/5677241.html 1. 应用边框样式 先从控制边框样式的属性开始.简单边框有三个关键属性:border-width.border- ...
- 内存管理 初始化(八) 至kswapd_init
至此,内存初始化部分已看完,遗留问题: 1.对于unicore或者mips的页表建立都很清楚,但是对于ARM我不清楚: 初始化部分涉及的页表映射建立,我都以unicore架构为准,ARM的页表映射从原 ...
- maven pom文件详解
http://www.blogjava.net/hellxoul/archive/2013/05/16/399345.html http://blog.csdn.net/houpengfei111/a ...
- 移动端网页使用flexible.js加入百度联盟广告样式不一致问题解决
flexible.js是淘宝推出的一款移动端手机自适应的库,源码内容很简洁,当网页使用了该库之后,页面会在head中加入对应的页面响应式的meta标签. 当使用flexible.js的时候,引入百度联 ...
- 深入理解css3中的flex-grow、flex-shrink、flex-basis
https://www.cnblogs.com/ghfjj/p/6529733.html
- flume使用之exec source收集各端数据汇总到另外一台服务器
转载:http://blog.csdn.net/liuxiao723846/article/details/78133375 一.场景一描述: 线上api接口服务通过log4j往本地磁盘上打印日志,在 ...