Spring Batch

背景介绍

一直以来,open source的项目和社区为企业级应用提供了大量的web-based和SOA messaging-based的框架,而对批处理(batch processing)关注的较少,因为缺少标准和可重用的批处理框架,导致企业内部出现了大量的一次性的(one-off)和闭门造车(in-house)的批处理解决方案(1688的task就是典型代表)。

鉴于此,SpringSource埃森哲公司联手致力于改变此状况,结合埃森哲在批处理上的架构经验和SpringSource的技术优势,Spring Batch应运而生,它标准化了批处理的处理流程,框架和工具,为企业提供了一个标准的,健壮的批处理解决方案。

一段时间以后,JCP发现这个Spring Batch做的不错哦,我们干脆把它变成整个Java社区的standard吧,就这样用一个JSR-352把Spring Batch给收编了。其实这种开源社区反哺JCP的事情早已经不是第一次了,想想当年的Hibernate之于JPA,Jersey之于JAX-RS,都是一样一样的,不过有标准总比没标准好,对于开发者最直接的好处就是减少学习和开发成本,不用重复造轮子。

核心概念

领域概念

如上图所示,JobLancher启动job,一个job包含若干step,每个step又包含一个ItemReader(读数据),ItemProcessor(处理数据),和ItemWriter(输出数据),job的元数据和运行状态则存储在JobRepository中。

运行时概念

Job的一次完整运行称为一个JobInstance,由JobParameter区分(Spring认为相同的Job不应该多次运行),即如果JobParameter相同则为同一个Job,而一次运行如果中途失败或者抛异常,再次运行仍为一个JobInstance,而其中的每次运行称为一个JobExecution。
执行一个step称为StepExecution
关系如下:
Job 1->n JobInstance 1->n JobExecution 1->n StepExecution
JobExecution和StepExecution各包含一个ExecutionContext,其中存储了key-value对,可以用来存储运行状态。

深入浅出

Batch NameSpace

在Spring中我们需要使用Spring Batch的扩展标签,需要我们在配置文件中,加入Batch的namespace,如下:

<beans:beans xmlns="http://www.springframework.org/schema/batch"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.2.xsd">
    <job id="ioSampleJob">
        <step id="step1">
            <tasklet>
                <chunk reader="itemReaderRef" processor="itemProcessorRef" writer="itemWriterRef" commit-interval="10" />
            </tasklet>
        </step>
    </job>
</beans:beans>

Chunk

以Chunk为单位的处理方式,就是从ItemRader中一次读取一条item数据,然后让ItemProcessor进行处理,处理后的item会在内存中暂存累积,当达到commit-interval指定的数值是,整个Chunk会通过ItemWriter进行写出(写到文件或数据库),顺利完成后,transaction被提交。

用一段代码简单表示上面的执行过程就是:

    List items = new Arraylist();
    for(int i = 0; i < commitInterval; i++){
        Object item = itemReader.read()
        Object processedItem = itemProcessor.process(item);
        items.add(processedItem);
    }
    itemWriter.write(items);

Tasklet

Chunk并不是Step唯一的运行方式,有些场景可能不需要这种read,process,write的三段式操作,例如通常在批处理中会产生临时文件,这种临时文件在job运行完后需要被删除,此时我们就可以简单的用一个tasklet来做清理文件的工作。创建一个TaskletStep,我们只需要写成<tasklet ref="deleteFileTasklet" />

注意在之间不能出现标签。

JobParameters

JobInstance = Job + JobParameters,JobParameters主要有两个作用:
1、用来向JobInstance运行时,提供参数。
2、用来鉴别JobInstance,JobInstance是根据不同的参数来区分的,同一个JobInstance不能被多次启动。
延迟绑定参数,Spring的Bean默认是singleton,也就是只有在Spring container启动时被实例化一次,这种Bean的参数只能被set一次,如果我们希望Bean的参数能够动态的从JobPatameters中获取,我们需要将Bean的scope设置为step。

    <bean id="customWriter" class="com.mkyong.writers.CustomWriter" scope="step">
        <property name="startDate" value="#{jobParameters['startDate']}" />
    </bean>

Spring Batch + Quartz实例

见附件

参考

JSR-352: http://download.oracle.com/otndocs/jcp/batch-1_0-fr-spec/
Spring Batch 参考手册:http://docs.spring.io/spring-batch/reference/pdf/spring-batch-reference.pdf
实例原型:http://www.mkyong.com/spring-batch/spring-batch-and-quartz-scheduler-example/
其它: http://jamie-wang.iteye.com/blog/1876320

时间: 2024-09-13 21:44:43

Spring Batch的相关文章

Spring Batch 2将支持工作划分和基于注解的配置

这一版本的新特性可以分为四类:对Java 5的支持.非顺序执行.增强的可伸缩性以及注解. 对Java 5的支持: Spring Batch 2.0版支持Java 5泛型和参数化类型,以便可以在编译时检查类型安全性.例如,ItemReader接口现在有了一个类型安全的read方法. 非顺序执行: 这其实包括3个新特性--条件.暂停和并行执行.凭借这些特性,各步骤可以按非线性顺序执行.即使工作(Job)中的某个步骤(step)失败,整个工作也依然能够完成.有条件执行(Conditional exec

Spring Batch Read from DB and Write to File

     Spring Batch是SpringSource和Accenture联合开发的,主要解决轻量级的大数据批处理.下在附上一个架构图,方便理解.     显然,在我们的开发过程中,我们主要观注ItemReader, ItemProcessor, ItemWriter, 数据的读写包括文件与数据库, 对于中间的环节ItemProcessor,也是至关重要的,也就是说:读来的数据的处理逻辑就在此,处理了之后再进入写的环节.当然我们可以重写ItemReader, ItemProcessor,

spring batch 报错,求大神赐教,急急急急。。。。。。

问题描述 spring batch 报错,求大神赐教,急急急急...... 2014-2-22 13:13:42 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@13d93f4: display name [org.spring

spring batch 2.0以上版 本 写数据库 遇到列超位 自动插入下一条

问题描述 spring batch 2.0以上版 本 写数据库 遇到列超位 自动插入下一条 我用skip设置跳过这个错误,但是由于没有rollback,又出现了主键制约的问题,请问怎么 处理 这个问题 或者怎么设置事务的rollback 解决方案 问题解决了. org.springframework.jdbc.datasource.DataSourceTransactionManager,用这个来管理事务, 而不是org.springframework.batch.support.transac

spring batch 说step取不到 求大神!!!!!!!!!!

问题描述 spring batch 说step取不到 求大神!!!!!!!!!! 错误信息:信息: Loading XML bean definitions from class path resource [message_job.xml]Exception in thread ""main"" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configurati

Spring Batch在大型企业中的最佳实践

在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是"批处理". 批处理应用通常有以下特点: 数据量大,从数万到数百万甚至上亿不等: 整个过程全部自动化,并预留一定接口进行自定义配置: 这样的应用通常是周期性运行,比如按日.周.月运行: 对数据处理的准确性要求高,并且需要容错机制.回滚机制.完善的日志监控等. 什么是Spring batch Sprin

介绍Spring Batch的Step Flow以及并发处理的重要特性

在实际应用中,我们的 Job 可能必须要包含多个 Step,为了提高性能,我们可能需要考虑 Job 的并发问题.Spring Batch 在这些方面又提供了哪些好的特性呢?让我们继续. Step Flow 通过前文我们已经知道,Step 是一个独立的.顺序的处理步骤,包含完整的输入.处理以及输出.但是在http://www.aliyun.com/zixun/aggregation/13760.html">企业应用中,我们面对的更多情况是多个步骤按照一定的顺序进行处理.因此如何维护步骤之间的

Spring Batch 专题

  如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架构设计给予支撑:但批处理领域的框架确凤毛麟角.是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界.   初识批处理典型场景 探秘领域模型及关键架构 实现作业健壮性与扩展性 批处理框架的不足与增强   批处理典型业务场景

一篇文章全面解析大数据批处理框架Spring Batch

如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架构设计给予支撑;但批处理领域的框架确凤毛麟角.是时候和我们一起来了解下批处理的世界哪些优秀的框架和设计了,今天我将以Spring Batch为例,和大家一起探秘批处理的世界. 如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有