Spring Batch学习笔记——steps之间共享数据

名词说明:

上下文:

执行:

执行上下文:

案例:

警告:一旦steps共享数据,这些数据就会把这些steps连接起来。努力使steps独立。如果你实在是不能独立他们,才使用下面的技术。你应该把数据共享作为steps不能独立的后备方案。

1 数据共享方式:

  • a step存储共享数据到数据库,receiving step从数据库读取他们
  • Execution context(执行上下文): 使用Spring  Batch execution context 作为data容器。a step往上下文写数据,一个step从上下文读数据
  • Holder:使用Spring bean和依赖注入。Spring往communicating beans中注入一个holder bean。第一个step往holder中set values,另一个step从holder中reads values

2 使用execution context来共享数据

什么是execution context:ExecutionContext类就代表了执行上下文,它就是一个适合与批应用的 键值对的一个 map。下面就是一个从上下文读写数据的例子:

executionContext.putString("importId", importId);
String importId = jobExecutionContext.getString("importId");

an execution context只是a job execution的一部分,并且不同的执行上下文

Jobs 和 steps 有它们自己的execution context

Spring Batch提供了两种execution context: job execution context和step execution context。它们都是ExecutionContext类型但是它们的作用域不同。下图说明了在一个job execution过程中的两种执行上下文。

那么怎么访问执行上下文呢?你需要引用对应的执行:JobExecution:如果你想访问job执行上下文,StepExecution:如果你想访问step执行上下文。几乎所有的Spring Batch artifacts能够很容易的访问JobExecution和StepExecution,不幸的是item reader,processor,writer功能不能访问它们。不过你可以实现一个监听接口(如:ItemStream)来洞察execution.下面列举了ItemReader通过实现ItemStream接口来访问执行上下文

清单1:

public class FilesInDirectoryItemReader implements
       ItemReader

  , ItemStream {
@Override
public void open(ExecutionContext executionContext)
    throws ItemStreamException { }
@Override
public void update(ExecutionContext executionContext)
    throws ItemStreamException { }
@Override
public void close() throws ItemStreamException { }
@Override
public File read() throws Exception, UnexpectedInputException,
    ParseException, NonTransientResourceException { (...) }
}
用job execution context在steps之间共享数据
时间: 2024-12-21 11:17:41

Spring Batch学习笔记——steps之间共享数据的相关文章

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

Spring Batch学习笔记三:JobRepository

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用HSQLDB,也就是说在Job的运行过程中,所有的元数据都被储存在内存中,在Job结束后会随着进程的结束自动消失:在这里我们推荐配置JobRepository去使用MySQL. 在这种情况下,Spring Batch在单次执行或者从一个执行到另外一个执行的时候会使用数据库去维护状态,Job执行的信息包

学习笔记4_ServletContext(重要整个Web应用的动态资源之间共享数据)

ServletContext(重要) 一个项目只有一个ServletContext对象! 我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据! 与天地同寿!!!这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去! 1 ServletContext概述 服务器会为每个应用创建一个ServletContext对象: l  ServletContext对象的创建是在服务器启动时完成的: l  ServletContext对象的销毁是在服务器关闭时

Spring视频学习笔记(二)

Spring视频学习笔记(二) XML配置里的Bean自动装配(三个来测试实现) /** * Person类 * */ public class Person { private String name; private Address address; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Ad

Spring MVC学习笔记(一)--------准备篇

这一系列笔记将带你一步一步的进入Spring MVC,高手勿喷. 首先你得安装以下的工具: JDK,虽然JDK8已经发布了一段时间了,但是由于我们并不会使用到里面的新特性,所以JDK6以上版本皆可以(需加入到PATH环境变量中): Servlet Container,为了能运行WEB应用程序,因此需要一个Web Container,这里我们建议Tomcat即可: IDE,一个好的IDE不仅能提高你开发的效率,还能降低你学习的成本,我们选择的是IntelliJ: 构建工具,推荐使用Gradle,它

[转]Spring MVC 学习笔记 json格式的输入和输出

Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.8.1</version>

两个Activity之间共享数据、互相访问的另一种方式的实现

本帖最后由 勇敢的心_ 于 2010-9-29 11:51 编辑本人从windows编程转过来学习Android开发,一直在想如果两个Activity之间能够像C#或delphi中的Form一样,可以直接访问其成员(字符.数值.成员对象等),并能调用其公开的方法,那应该比用Intent来传递数据直接方便的多,于是偿试了如下办法,测试基本没有问题,发出来大家讨论一下.本人学习android不久,幼稚的地方希望大家不要见笑原理:假设有两个Activity:ActivityMain 和 Activit

[Spring MVC]学习笔记--@RequestMapping

@RequestMapping是用来将请求的url,映射到整个类,或者里面的方法. @Controller @RequestMapping("/test") public class TestController { private final TestService service; @Autowired public TestController(TestService testService) { this.service = testService; } @RequestMap

Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过 Content Provider组件来实现.那么,Content Provider组件又是如何突破应用程序边界权限控制来实现在不同的应用程序之间共享数据的呢?在前面的文章中,我们已经简要介绍过它是通过 Binder进程间通信机制以