领先一步
VMware 提供培训和认证,助力您快速进步。
了解更多
今天我们很高兴宣布 Spring Batch 3.0 的第一个里程碑版本发布(下载)。通过此版本,我们迈出了实现 JSR-352 Java 批处理规范的第一步。Spring Batch 是一个轻量级、全面的框架,用于开发健壮的批处理应用。
JSR-352 被认为是 Java 平台的批处理标准化规范。作为标准化的一部分,此 JSR 包含三个主要部分:
Spring 在对该规范的贡献上投入了大量时间和资源。我们通过 JCP 与其他行业专家合作,JSR-352 验证了 Spring Batch 在过去五年中在无数生产环境中实现并经过实战检验的批处理模式,是构建关键任务批处理应用的最佳方法。
此版本是 Spring Batch 向符合 JSR 规范迈出的第一步。在 JSR-352 TCK 的 155 个 SE 测试中,此版本通过了 70 个。此版本中实现的具体特性包括:
JobOperator
实现JSR 定义了一个 JobOperator
接口,它是 Spring Batch 的 JobOperator
和 JobExplorer
接口的组合。对于该规范而言,此接口是批处理应用的入口点,用于与作业本身交互(启动/停止/重新启动等)以及与作业仓库交互(例如,提供查询先前运行的 JobExecutions 的能力)。因此,JobOperator
需要提供一定级别的开箱即用服务。JsrJobOperator
(javax.batch.operations.JobOperator
的 Spring 实现)引导启动一个 Spring 上下文,类似于 @EnableBatchProcessing
。开箱即用地,它包含 JobRepository
、JobLauncher
、JobOperator
、JobExplorer
、DataSource
、TransactionManager
、ParametersConverter
、JobRegistry
和 PlaceholderPropertiesConfigurer
。所有这些都可以在运行时通过在启动或重新启动作业时提供的上下文来覆盖默认 Bean。默认情况下,JobRepository
在内存配置中利用 HSQLDB。
根据 JSR 规范,启动作业实际上非常简单:
JobOperator jobOperator = BatchRuntime.getJobOperator(); JobExecution jobExecution = jobOperator.start("jsrJob", new Properties());
上面这两行代码将引导启动之前定义的基准上下文(这只会发生一次),然后从 /META-INF 加载 batch.xml 文件(如果存在),以及在 /META-INF/batch-jobs 中 jsrJob.xml 定义的上下文。jsrJob.xml 可以是两种配置之一。它可以是标准的 Spring 上下文配置,将任何批处理 artifact 定义为 Spring Bean,并通过 JSR-352 DSL 定义作业;或者它也可以仅仅是 JSR 定义的作业定义。根据 JSR-352,jsrJob.xml 上下文中只能定义一个作业。JsrJobOperator
的其余功能实际上是对现有 JobOperator
和 JobExplorer
功能的直接封装(因此它们被包含在基准应用上下文中)。
JSR-352 定义了一种基于 XML 的 DSL,任何 Spring Batch 用户都会立刻感到熟悉。它由 jobs、steps、readers 和 writers 组成,Spring Batch 命名空间中的大多数概念都在 JSR-352 中得到了体现。作为此版本的一部分,开发者将能够使用 JSR 定义的 DSL 配置基本作业。基本作业包括以下内容:
<job>
<step>
<chunk>
<batchlet>
<reader>
<processor>
<writer>
<decision>
<listeners>
/<listener>
<properties>
/<property>
<skippable-exception-classes>
及相关子元素<retryable-exception-classes>
及相关子元素<checkpoint-algorithm>
<next>
/<end>
//<code><fail>
使用 JSR 规范,一个通过 Spring Batch DSL 看起来像这样的批处理作业:
<job id="data" xmlns="http://www.springframework.org/schema/batch">
<step id="import" next="report">
<tasklet>
<chunk commit-interval="100"
reader="itemReader"
writer="dataWriter" />
</tasklet>
</step>
<step id="report">
<tasklet ref="reportTasklet"/>
</step>
</job>
将看起来像这样:
<job id="data" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="import" next="report">
<chunk item-count="100">
<reader ref="itemReader"/>
<writer ref="dataWriter"/>
</chunk>
</step>
<step id="report">
<batchlet ref="reportBatchlet"/>
</step>
</job>
从配置角度来看,此版本未包含的主要特性是并行执行选项,包括 splits 和 partitioning。
要通过 JSR 的 DSL 配置作业,开发者可以将配置嵌入到 Spring 上下文中,或者像上面所示那样通过独立的 XML 文档进行配置。在上面的作业定义中,由于 batchlet reportBatchlet 未在同一个 XML 文件中定义为 bean,因此它需要解析到某个地方……
batch.xml
JSR-352 不需要依赖注入框架即可使用。但是,规范依赖于许多与 DI 相关的特性。首先是通过 DSL 构建作业时引用命名批处理 artifact。在上面的示例中,reportBatchlet 可以引用以下两者之一:在链接到该文件的上下文中定义的 Spring bean,或在应用 /META-INF 目录下的 batch.xml 文件中定义的批处理 artifact。batch.xml 文件提供了一种非常简单的方法来定义名称到类名的配对。一个处理上述情况的 batch.xml 示例文件看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<batch-artifacts xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<ref id="reportBatchlet" class="org.springframework.batch.core.jsr.step.batchlet.BatchletSupport"/>
</batch-artifacts>
虽然版本 3.0.0.M1 支持 batch.xml 的要求,但建议用户改用 Spring 上下文配置,因为它具有更强大的依赖注入和 bean 工厂选项。
未来的版本将完全支持 JSR-352 中定义的完整表达式语言。
JSR-352 之外
虽然 JSR-352 定义了一个构建批处理应用的基础,这与 Spring Batch 已经提供的类似,但需要注意的是,Spring Batch 所提供的功能远超 JSR-352 的定义范围。例如,虽然 JSR 定义了用于构建像 ItemReaders
和 ItemWriters
这样的批处理 artifact 的 API,但它不提供任何实现。Spring Batch 提供了一个全面的实现库,几乎无需定制即可使用。使用这些开箱即用的组件不仅能提高您的生产力,还能让您放心,因为您使用的组件已经在最严苛的生产环境中经过了测试。
Spring Batch 还将批处理推向了远超 JSR-352 概述的范围。Spring Batch 提供了一个平台,用于轻松构建可伸缩的批处理应用。通过远程 partitioning 和远程 chunking,Spring Batch 应用可以在标准化和简便的方式下跨多个 JVM 进行扩展。将 Spring Integration 添加到您的批处理解决方案中,可提供诸如消息驱动的作业启动、文件轮询、上传/下载等更多功能。
最后,Spring Batch 正在突破批处理作业的功能边界和运行地点边界。Spring Data for Apache Hadoop 提供了组件,可以在使用 Spring Batch 作为编排工具的同时运行 Map/Reduce、Hive、Pig 等作业。在接下来的几个月里,我们将发布工具,以便通过 Yarn 在 Hadoop 集群上运行 Spring Batch 作业。上述所有功能都可以由 Spring XD 进行封装,它通过提供一个单一系统来模糊 Spring Batch、Spring Integration 和 Spring Data 之间的界限,该系统支持数据摄取、实时分析、批处理和数据导出。
结论
Spring 在 JSR-352 上进行了大量投入,并致力于将其与 Spring Batch 集成实现。此版本代表了我们对此 JSR 的持续投资,标志着我们向符合 JSR-352 规范迈出了第一步。我们期待您在论坛、Jira 和 SpringOne2GX 现场提供反馈!