今天我们很高兴地宣布 Spring Batch 3.0 的第一个里程碑版本 (下载)。通过此版本,我们迈出了实现 JSR-352 Java Batch 规范的第一步。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 的 JobOperator
和 JobExplorer
接口的组合。对于规范来说,这个接口是批处理应用与作业本身(启动/停止/重启等)以及作业仓库(例如提供查询之前运行的 JobExecution 的能力)交互的入口点。因此,JobOperator
需要提供开箱即用的服务级别。JsrJobOperator
(Spring 对 javax.batch.operations.JobOperator
的实现)会引导一个类似于 @EnableBatchProcessing
的 Spring 上下文。开箱即用地,它包含了 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 上下文配置,将任何批处理 artifacts 定义为 Spring Bean 并通过 JSR-352 DSL 定义作业,或者它可以是仅由 JSR 定义的作业定义。根据 JSR-352,jsrJob.xml 上下文中只能定义一个作业。JsrJobOperator
的其余功能实际上是对现有 JobOperator
和 JobExplorer
功能的直接包装(因此它们被包含在基本应用上下文中)。
通过 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>
//<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…