Spring Batch 介绍

企业领域中的许多应用都需要进行批量处理,以便在关键任务环境中执行业务操作。这些业务操作包括:

  • 对大量信息进行自动化、复杂的处理,无需用户交互即可最有效地完成。这些操作通常包括基于时间的事件(例如月末计算、通知或通信)。

  • 将复杂的业务规则定期应用于非常大的数据集进行重复处理(例如,保险福利确定或费率调整)。

  • 集成来自内部和外部系统的信息,这通常需要格式化、验证并以事务方式处理到记录系统中。企业每天使用批处理处理数十亿笔事务。

Spring Batch 是一个轻量级、全面的批处理框架,旨在支持开发对企业系统日常运行至关重要的健壮批处理应用。Spring Batch 基于 Spring Framework 的特点(生产力、基于 POJO 的开发方法和易用性),同时使开发者在需要时能轻松访问和使用更高级的企业服务。Spring Batch 不是一个调度框架。在商业和开源领域都有许多优秀的企业调度器(例如 Quartz, Tivoli, Control-M 等)。Spring Batch 旨在与调度器协同工作,而不是取代调度器。

Spring Batch 提供了在处理大量记录时必不可少的许多可重用功能,包括日志和追踪、事务管理、Job 处理统计、Job 重启、跳过和资源管理。它还提供了更高级的技术服务和特性,通过优化和分区技术实现极高吞吐量和高性能的批处理 Job。你可以在简单的用例(例如将文件读入数据库或运行存储过程)和复杂、高吞吐量的用例(例如在数据库之间移动大量数据、转换数据等)中使用 Spring Batch。高吞吐量的批处理 Job 可以以高度可伸缩的方式使用该框架来处理大量信息。

背景

虽然开源软件项目和相关社区更关注基于 Web 和微服务的架构框架,但对于适应基于 Java 的批处理需求的、可重用架构框架的关注度明显不足,尽管企业 IT 环境中持续需要处理此类任务。缺乏标准、可重用的批处理架构导致在客户端企业 IT 部门内部开发了许多一次性、内部使用的解决方案。

SpringSource(现为 VMware)与埃森哲(Accenture)合作改变了这一状况。埃森哲在实施批处理架构方面的实践行业和技术经验、SpringSource 深厚的技术经验以及 Spring 久经考验的编程模型共同形成了一个自然且强大的合作伙伴关系,旨在创建高质量、符合市场需求的软件,填补企业 Java 领域的重要空白。两家公司与许多正在通过开发基于 Spring 的批处理架构解决方案来解决类似问题的客户进行了合作。这些输入提供了有用的额外细节和现实约束,有助于确保该解决方案能够应用于客户面临的实际问题。

埃森哲贡献了其此前专有的批处理架构框架给 Spring Batch 项目,同时还贡献了 committer 资源来推动支持、增强和现有功能集。埃森哲的贡献基于其在构建批处理架构方面数十年的经验,涵盖了前几代平台:大型机上的 COBOL、Unix 上的 C++ 以及现在的 Java 平台。

埃森哲与 SpringSource 的合作努力旨在推动软件处理方法、框架和工具的标准化,以便企业用户在创建批处理应用时能够持续使用。希望为其企业 IT 环境提供标准、成熟解决方案的公司和政府机构都可以从 Spring Batch 中受益。

使用场景

典型的批处理程序通常会

  • 从数据库、文件或队列读取大量记录。

  • 以某种方式处理数据。

  • 以修改后的形式写回数据。

Spring Batch 自动化了这种基本的批处理迭代,提供了将类似事务作为一组进行处理的能力,通常在无需用户交互的离线环境中进行。批处理 Job 是大多数 IT 项目的一部分,而 Spring Batch 是唯一提供健壮、企业级解决方案的开源框架。

业务场景

Spring Batch 支持以下业务场景:

  • 定期提交批处理。

  • 并发批处理:Job 的并行处理。

  • 分阶段的、企业消息驱动的处理。

  • 大规模并行批处理。

  • 失败后手动或计划重启。

  • 依赖 Step 的顺序处理(可扩展到工作流驱动的批处理)。

  • 部分处理:跳过记录(例如,在回滚时)。

  • 整批事务,适用于批处理大小较小或已有存储过程或脚本的情况。

技术目标

Spring Batch 的技术目标如下:

  • 让批处理开发者使用 Spring 编程模型:专注于业务逻辑,让框架处理基础设施。

  • 明确区分基础设施、批处理执行环境和批处理应用。

  • 提供通用的核心执行服务接口,所有项目都可以实现。

  • 提供核心执行接口的简单默认实现,可“开箱即用”。

  • 通过在所有层中使用 Spring 框架,轻松配置、定制和扩展服务。

  • 所有现有的核心服务都应易于替换或扩展,而不影响基础设施层。

  • 提供简单的部署模型,架构 JAR 包与应用完全分离,使用 Maven 构建。