上月发布的Java EE 7平台包含了批处理编程模型的规范,它很大程度上由VMware的Spring Batch项目派生而来。上月Spring Batch也被广泛提及,因为它发布了一个值得关注的释放版本,这个版本带来了更为简洁的配置和最新的数据访问方式。
Java平台上的批处理应用程序,也就是JSR-352,为应用开发人员提供了一个开发健壮批处理系统的模型。这个编程模型的核心是借鉴于Spring Batch的开发模式,也就是它创造的Reader-Processor-Writer模式,在这个模式中鼓励开发人员遵循面向数据块的处理标准。
Reader-Processor-Writer模式可拆分为三个工作流程步骤,要求开发人员去遵循:
按照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