写点什么

Java EE 7,Spring 标准化的 Batch

  • 2013-07-01
  • 本文字数:2068 字

    阅读完需:约 7 分钟

上月发布的 Java EE 7 平台包含了批处理编程模型的规范,它很大程度上由 VMware 的 Spring Batch 项目派生而来。上月 Spring Batch 也被广泛提及,因为它发布了一个值得关注的释放版本,这个版本带来了更为简洁的配置和最新的数据访问方式。

Java 平台上的批处理应用程序,也就是 JSR-352,为应用开发人员提供了一个开发健壮批处理系统的模型。这个编程模型的核心是借鉴于 Spring Batch 的开发模式,也就是它创造的 Reader-Processor-Writer 模式,在这个模式中鼓励开发人员遵循面向数据块的处理标准。

_Reader-Processor-Writer_ 模式可拆分为三个工作流程步骤,要求开发人员去遵循:

  • ItemReader_ 类被设计用来消费要处理数据的一个 _ 数据块(通常是一条记录);
  • ItemProcessor,业务和领域逻辑会基于 _ 数据块 _ 对其进行处理;
  • 最后,记录将会在处理后委托给 _ItemWriter_,然后进行聚集。

按照 JSR 规范,Job_ 要通过 XML 文档进行描述并且包含了处理流程中的 _Steps。每个 _Step_ 负责描述每个 _ 数据块 _ 将要进行怎样的处理以及提交要基于什么样的间隔进行注册。对于流程中某个更为复杂的 _Step_ 处理需求可以通过 JSR-352 的 _batchlet_ 来进行处理。JSR-352 中的 _batchlet_ 对应于 Spring Batch 的 _tasklet_,它提供了处理一个 _Step_ 的策略。

JSR-352 也借用了 Spring Batch 的模式来访问和控制任务。任务要通过 _JobOperator_ 来触发,而任务的结果要通过 _JobRepository_ 进行访问。在 Spring Batch 中,_JobRepository_ 的名字是相同的,而 JobOperator_ 被称之为 _JobLauncher

与 Spring Batch 定义任务的方式稍有差别,Java EE7 的应用开发人员需要将任务的 XML 文档放到工程的 META-INF/batch-jobs 目录之中。在 Spring Batch 中,开发人员可以将它们的任务配置放在 Spring 应用上下文的任何地方,只要在容器中能够访问到就可以。

Java EE 7 容器的任务 XML 要定义具体的 _Reader_、_Processor_ 以及 _Writer_ 类,除此之外,还有缓冲区的大小、提交的间隔以及检查点策略。检查点策略用于描述提交是如何进行处理的。默认值是“item”,但是开发人员也可以选择将“time”作为提交策略。在前一种场景中,提交间隔描述的是处理过的记录数,而后者描述的是秒数。

复制代码
<job id="myJob" xmlns="http://batch.jsr352/jsl">
<step id="myStep" >
<chunk
reader="MyItemReader"
writer="MyItemWriter"
processor="MyItemProcessor"
buffer-size="5"
checkpoint-policy="item"
commit-interval="10" />
</step>
</job>

Spring Batch 的任务描述与 Java EE7 基本上是相同的,需要说明的是步骤的定义要包含在 _tasklet_ 指令之中。chunk 配置中的 reader、process 以及 writer 属性引用了应用上下文中已有的 Bean。在 2.2.0 版本中,chunk 配置中的 commit-interval 描述了在进行一次提交之前必须要处理的记录数。

复制代码
<job id="myJob">
<step name="myStep">
<tasklet>
<chunk
reader="myItemReader"
processor="myItemProcessor"
writer="myItemWriter"
commit-interval="2" />
</tasklet>
</step>
</job>
<bean id="myItemReader" class="...MyItemReader" />
<bean id="myItemProcessor" class="...MyItemProcessor" />
<bean id="myItemWriter" class="...MyItemWriter" />

尽管目前的目标是要与 JSR-352 兼容,但是 Spring Batch 超出规范的一点在于,它为开发人员提供了一种与 Spring 生态系统中其他组件进行无缝集成的方式。在批处理的场景下,Spring Data 可以直接作为 _Reader-Processor-Writer_ 模式中的 _Reader_,从而允许开发人员从 Spring Data Repository 之中查询数据块。同样是在上月发布的 Spring Batch 2.2.0 版本中,为使用 Spring Data 的 MongoDB 和 Neo4j 数据存储,提供了改进后的接口。

除了简化 Reader 接口,最新的 Spring Batch 释放版本为 Spring Java 配置提供了扩展支持,从而可以简化批处理特性。为了启用这个简化的配置,开发人员需要为带有 @Configuration 注解的类再添加 @EnableBatchProcessing 注解。通过这种方式,像 JobRepository 和 JobLauncher 这样的批处理特性就能够直接进行装配,而无需额外的配置。

复制代码
@Configuration
@EnableBatchProcessing
public class AppConfig {
@Autowired
private JobBuilderFactory jobs;
@Bean
public Job job() {
return jobs.get("myJob").start(step1()).next(step2()).build();
}
@Bean
protected Step step1() {
...
}
@Bean
protected Step step2() {
...
}
}

Spring Batch 2.2.0 除了增强数据获取和配置以外,这个最新的释放版本也将对 Spring 框架的版本依赖升级到了 3.1.2。要使用最新版本 Spring Batch 的 Spring 开发人员在开发批处理应用的时候,需要满足这个最小版本要求。

原文英文链接: Java EE 7, Spring Standardize Batch

2013-07-01 10:596475

评论

发布
暂无评论
发现更多内容

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范

合合技术团队

人工智能 大数据 商业化

ARTS 打卡第 1 周 鸿蒙入门开发教程:一文带你详解工具箱元服务的开发流程

坚果

ARTS 打卡计划 HarmonyOS OpenHarmony 元服务 ArkTS

【我和openGauss的故事】openGauss5.0在某省医保局实时数仓应用

daydayup

openGauss数据库源码解析系列文章——安全管理源码解析(三)

daydayup

新利好带动 POSE 持续上扬,月内几近翻倍

BlockChain先知

【Linux】云服务器自动化部署VuePress博客(Jenkins)

ReturnTmp

jenkins vuepress

从推动到拉动:研发效能提升的第一性原理

CODING DevOps

AIGC 浪潮下,鹅厂新一代前端人的真实工作感受

CODING DevOps

可视化数据分析工具是什么?可以用来做什么?

巷子

【我和openGauss的故事】原生openGauss与Oracle数据库函数兼容性对比验证测试

daydayup

【我和openGauss的故事】在Kylin桌面版操作系统中配置openGauss的ODBC数据源

daydayup

openGauss数据库源码解析系列文章——安全管理源码解析(四)

daydayup

中国信通院高质量数字化转型产品及服务全景图发布,合合信息多项AI产品入选

合合技术团队

人工智能 数字化转型

【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本

ReturnTmp

node.js centos

C++友元函数和友元类的使用

芯动大师

c++ 友元

新利好带动 POSE 持续上扬,月内几近翻倍

鳄鱼视界

面部表情识别技术在安全领域的应用

数据堂

通义千问开源模型部署使用

WizInfo

通义千问

ToolLLM:能够使用 16000 种真实 API 的 LLM

Zilliz

AIGC Towhee LLM

【我和openGauss的故事】openGauss5.0特性:CM支持VIP仲裁特性

daydayup

openGauss-graph 0.2.0版本正式上线

daydayup

作为网络报表分析工具的Quick BI,其功能如何

夜雨微澜

怎么快速更新Python的第三方库?教你一招,小白也能学会

程序员晚枫

Python 编程 计算机 第三方库

【我和openGauss的故事】Navicat连接openGauss_5.0.0 企业版数据库

daydayup

【我和openGauss的故事】openGauss 主备架构及同步复制模式理论学习与验证测试

daydayup

2023-08-10:景区里有m个项目,也就是项目数组为int[][] game,这是一个m*2的二维数组 景区的第i个项目有如下两个参数: game[i] = { Ki, Bi } Ki一定是负数,

福大大架构师每日一题

左程云 福大大架构师每日一题

javascript之webAPIs(1)

timerring

JavaScript

Spring 架构

小万哥

Java spring 后端 springboot SpringCloud

【我和openGauss的故事】一文帮你理解openGauss的高可用方案

daydayup

go-zero 是如何实现令牌桶限流的?

AlwaysBeta

Go 源码 微服务 go-zero 限流器

Java EE 7,Spring标准化的Batch_Java_Dan Woods_InfoQ精选文章