Spring Batch 3.0 里程碑版本 1 发布

工程 | Michael Minella | 2013年8月23日 | ...

今天,我们很高兴地宣布 Spring Batch 3.0 的第一个里程碑版本发布 (下载)。通过此版本,我们朝着实现 JSR-352 Java 批处理规范迈出了第一步。Spring Batch 是一个轻量级、全面的框架,用于开发健壮的批处理应用程序。

JSR-352

JSR-352 被认为是 Java 平台批处理处理的标准化。作为标准化的一部分,此 JSR 包含三个主要部分

  • 基于 XML 的 DSL 用于配置作业
  • 用于创建作业相关组件(读取器/写入器等)的 API
  • 支持类和概念的 API 和行为描述

Spring 已投入大量时间和资源来为该规范做出贡献。我们通过 JCP、JSR-352 与其他行业专家进行合作,证明了 Spring Batch 在过去五年中在无数生产环境中实施和测试的批处理模式是构建关键任务批处理应用程序的最佳方法。

里程碑版本 1 中的功能

此版本是 Spring Batch 符合 JSR 的第一步。在 JSR-352 TCK 中的 155 个 SE 测试中,此版本通过了 70 个。在此版本中实现的具体功能包括

  • JobOperator 实现
  • 通过 XML 进行基本的作业配置
  • batch.xml 支持

JobOperator

JSR 定义了一个JobOperator接口,它是 Spring Batch 的JobOperatorJobExplorer接口的组合。对于规范,此接口用作批处理应用程序与作业本身(启动/停止/重新启动等)以及作业存储库(例如,提供查询先前运行的 JobExecutions 的能力)交互的入口点。因此,JobOperator需要提供一定程度的开箱即用服务。JsrJobOperatorjavax.batch.operations.JobOperator的 Spring 实现)引导一个类似于@EnableBatchProcessing的 Spring 上下文。开箱即用,它包括JobRepositoryJobLauncherJobOperatorJobExplorerDataSourceTransactionManagerParametersConverterJobRegistryPlaceholderPropertiesConfigurer。所有这些都可以在运行时通过在启动或重新启动作业时提供的上下文中覆盖默认 bean 来覆盖。默认情况下,JobRepository在内存配置中使用 HSQLDB。

根据 JSR,启动作业实际上非常容易

JobOperator jobOperator = BatchRuntime.getJobOperator();
JobExecution jobExecution = jobOperator.start("jsrJob", new Properties());

以上两行将引导先前定义的基础上下文(仅发生一次),然后从 /META-INF 加载 batch.xml 文件(如果存在)以及 jsrJob.xml 中定义的上下文(位于 /META-INF/batch-jobs 中)。jsrJob.xml 可以是两种配置之一。它可以是定义任何批处理工件作为 Spring Bean 和通过 JSR-352 DSL 定义的作业的标准 Spring 上下文配置,或者它可以只是 JSR 定义的作业定义。根据 JSR-352,只能在一个 jsrJob.xml 上下文中定义一个作业。JsrJobOperator其余的功能实际上是对现有JobOperatorJobExplorer功能的直接封装(因此它们包含在基本应用程序上下文中)。

通过 XML 进行基本的作业配置

JSR-352 定义了一个基于 XML 的 DSL,任何 Spring Batch 用户都会立即发现它很熟悉。它由作业、步骤、读取器和写入器组成,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>

从配置的角度来看,此版本中未包含的主要功能是并行执行选项,包括拆分和分区。

要通过 JSR 的 DSL 配置作业,开发人员可以将配置嵌入到 Spring 上下文中,也可以通过如上所示的独立 XML 文档进行配置。在上面的作业定义中,由于 batchlet reportBatchlet 未在同一 XML 文件中定义为 bean,因此它需要解析到某个地方……

batch.xml

JSR-352 不需要依赖注入框架才能使用。但是,规范依赖于许多与 DI 相关的功能。第一个是通过引用命名批处理工件构建作业。在上面的示例中,reportBatchlet 可以指代两件事之一:在链接到该文件的上下文中定义的 Spring bean 或在应用程序的 /META-INF 目录中找到的 batch.xml 文件中定义的批处理工件。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`)的 API,但它没有提供任何实现。Spring Batch 提供了一个全面的实现库,几乎无需任何自定义即可使用。使用这些开箱即用的组件不仅可以提高您的工作效率,还可以让您安心,因为您使用的是在最苛刻的生产环境中经过测试的组件。

Spring Batch 还使批处理处理远远超出了 JSR-352 的概述。Spring Batch 提供了一个平台,可以轻松构建可扩展的批处理应用程序。通过远程分区和远程分块,Spring Batch 应用程序可以在多个 JVM 中以标准化和简便的方式进行扩展。将 Spring Integration 添加到您的批处理解决方案中,可以提供消息驱动的作业启动、轮询文件、上传/下载等功能。

最后,Spring Batch 正在突破批处理作业的功能和运行位置的界限。Spring Data for Apache Hadoop 提供了运行 Map/Reduce、Hive、Pig 等作业的组件,同时使用 Spring Batch 作为编排工具。在接下来的几个月中,我们将发布工具,以便通过 Yarn 在 Hadoop 集群上运行 Spring Batch 作业。所有上述内容都可以由 Spring XD 包装,Spring XD 通过提供一个用于数据摄取、实时分析、批处理和数据导出的单一系统,模糊了 Spring Batch、Spring Integration 和 Spring Data 之间的界限。

结论

Spring 对 JSR-352 进行了大量投资,并致力于在 Spring Batch 中实现它。此版本构成了我们对该 JSR 的持续投资,因为我们朝着 JSR-352 兼容迈出了第一步。我们期待您在论坛、Jira 和 SpringOne2GX 上提供反馈!

获取 Spring 电子报

通过 Spring 电子报保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部