今天,我们很高兴宣布 Spring Batch 3.0 的第一个里程碑版本(下载)。通过此版本,我们迈出了实现 JSR-352 Java Batch 规范的第一步。Spring Batch 是一个轻量级、全面的框架,用于开发健壮的批处理应用程序。
JSR-352
JSR-352 被认为是 Java 平台的批处理标准化规范。作为标准化的一部分,该 JSR 包括三个主要部分
- 用于配置 Job 的基于 XML 的 DSL
- 用于创建 Job 相关组件(读取器/写入器等)的 API
- 支持类和概念的 API 及行为描述
Spring 在对此规范的贡献上投入了大量时间和资源。我们通过 JCP 与其他行业专家的协作,JSR-352 验证了 Spring Batch 在过去五年中在无数生产环境中实现并经过实战考验的批处理模式是构建关键任务批处理应用程序的最佳方法。
里程碑 1 中的功能
此版本是 Spring Batch 符合 JSR 的第一步。在 JSR-352 TCK 的 155 个 SE 测试中,此版本通过了 70 个。此版本中实现的特定功能包括
JobOperator
实现
- 通过 XML 进行基本 Job 配置
- batch.xml 支持
JobOperator
JSR 定义了一个 JobOperator
接口,它是 Spring Batch 的 JobOperator
和 JobExplorer
接口的组合。对于该规范,此接口作为批处理应用程序的入口点,用于与 Job 本身进行交互(启动/停止/重启等)以及与 Job 仓库进行交互(例如,提供查询先前运行的 JobExecution 的能力)。因此,JobOperator
需要提供开箱即用的服务级别。JsrJobOperator
(javax.batch.operations.JobOperator
的 Spring 实现)引导启动一个类似于 @EnableBatchProcessing
的 Spring Context。开箱即用,它包括 JobRepository
、JobLauncher
、JobOperator
、JobExplorer
、DataSource
、TransactionManager
、ParametersConverter
、JobRegistry
和 PlaceholderPropertiesConfigurer
。所有这些都可以在启动或重新启动 Job 时通过提供的 Context 覆盖默认 bean 来在运行时进行覆盖。默认情况下,JobRepository
在内存配置中利用 HSQLDB。
根据 JSR,启动一个 Job 实际上非常简单
JobOperator jobOperator = BatchRuntime.getJobOperator();
JobExecution jobExecution = jobOperator.start("jsrJob", new Properties());
上面两行代码将引导启动先前定义的基础 Context(这只发生一次),然后从 /META-INF 加载 batch.xml 文件(如果存在),以及在 /META-INF/batch-jobs 中 jsrJob.xml 定义的 Context。jsrJob.xml 可以是两种配置之一。它可以是标准的 Spring Context 配置,将任何批处理构件定义为 Spring Bean,并通过 JSR-352 DSL 定义 Job;或者它可以是 JSR 定义的 Job 定义。根据 JSR-352,jsrJob.xml Context 中只能定义一个 Job。JsrJobOperator
的其余功能实际上是对现有 JobOperator
和 JobExplorer
功能的直接封装(因此它们被包含在基础应用程序 Context 中)。
通过 XML 进行基本 Job 配置
JSR-352 定义了一个基于 XML 的 DSL,任何 Spring Batch 用户都会立即感到熟悉。它由 Jobs、Steps、Readers 和 Writers 组成,Spring Batch 命名空间中的大多数概念都在 JSR-352 中有所体现。作为此版本的一部分,开发者将能够使用 JSR 定义的 DSL 配置基本 Job。基本 Job 包括以下内容
<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 看起来像这样
<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…