这里我们讲述一下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的使用(七)的更多相关文章

  1. YII内置验证规则

    required: 必填字段验证, 来自 CRequiredValidator类的别名 array(‘字段名列表用逗号隔开’, ‘required’),    就这样的一个小小的写法,可以让字段前面加 ...

  2. Spring Batch介绍

    简介 SpringBatch 是一个大数据量的并行处理框架.通常用于数据的离线迁移,和数据处理,⽀持事务.并发.流程.监控.纵向和横向扩展,提供统⼀的接⼝管理和任务管理;SpringBatch是Spr ...

  3. SpringBoot整合SpringBatch

    一.引入依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  4. springbatch操作CSV文件

    一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...

  5. SpringBatch的核心组件JobLauncher和JobRepository

    Spring Batch的框架包括启动批处理作业的组件和存储Job执行产生的元数据.因此只需掌握配置这个基础框架在批处理应用程序中即启动Jobs并存储Job元数据. 组件:Job Launcher和J ...

  6. SpringBatch简介

    spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...

  7. spring-boot-oracle spring-batch

    Install/Configure Oracle express Oracle xe installer for linux (I don't care if you're running linux ...

  8. springbatch的封装与使用

    springbatch 主要实现批量数据的处理,我对batch进行的封装,提出了jobBase类型,具体job需要实现它即可.Spring Batch 不仅提供了统一的读写接口.丰富的任务处理方式.灵 ...

  9. SpringBatch的流程简介

    SpringBatch的流程图如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器装了若干Step,Batch中实际干活的也就是这些Step,至于Step干什么活,无外乎读取数据,处 ...

  10. SpringBatch的初步了解

    一.SpringBatch是一个批处理的框架,作为一个Spring组件,提供了通过使用Spring的依赖注入来处理批处理的条件. 什么是批处理呢? 在现代企业应用当中,面对复杂的业务以及海量的数据,除 ...

随机推荐

  1. e616. Determining If a Focus Lost Is Temporary or Permanent

    A temporary focus-lost event occurs if the focus moves to another window. It's temporary because the ...

  2. (转)android系统架构及源码目录结构

    转自:http://blog.csdn.net/finewind/article/details/46324507 1. Android系统架构: android系统架构采用了分层架构的思想,如下图所 ...

  3. Xianfeng轻量级Java中间件平台:功能管理

    功能管理:从功能类型来看,不属于用户使用的功能,而属于系统维护使用的功能,因为对于用户来说,是不可见的.功能管理的作用是定义一套规则,用来处理权限等业务,比如常见的菜单权限控制.按钮权限控制等情景 在 ...

  4. C# 从类库中获取资源图片,把图片资源保存到类库中

    /// <summary> /// 获取资源图片 /// </summary> public class AssemblyHelper { #region 常量 /// < ...

  5. u3d fpsCounter

    因为u3d自己的stats下面的fpscounter不是实际意义上的fps,所以看到demo的fpsCounter,把它改写为c#的 using UnityEngine;using System.Co ...

  6. Objective-c: 移除字符串中的指定字符

    string = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInS ...

  7. Oracle11g select查询时候输出未选定行

    解决方法是: 查询的表名是否是大写的: 是否没有提交执行结果:可以commit一下:

  8. Asp.net mvc怎么在razor里写js代码

    我试图在Razor里写JS代码,但是不行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3 ...

  9. level1 - unit 1 - 句子结构

    preface 学习英语做为一种爱好,就是希望有一天能够和老外流畅沟通,目前来看,日常沟通还是没有问题的和我的外教. 知识日积月累,现在就把以前学习的(从初中到现在)知识总结下.每天一更,更到单元总结 ...

  10. python获取两个dict的不同

    参数: dict1, dict2 需求:如果dict1和dict2中有不同的key,那么返回这个(key, dict1[key]):如果dict1和dict2中有相同的key,但是value不同,返回 ...