您可能已经知道,JSR-352是一个Java批处理的标准。该标准在今年发布,并被包含在了JEE7之中,这意味着,所有的JEE7应用服务器都会有批处理的能力。正如我在上一篇文章中指出,即使您的应用服务器是固定的,但是您依旧可以选择JSR-352的实现。
既然您可以选择,那么您应该怎么样选择呢?当然,这和JSR-352提供了什么没有关系,因为所有的实现都会有这些功能。你应该根据那些超出标准之外功能来进行选择。在本文中,基于之前在一些有代表性的公司例如保险公司和银行,中实现Spring Batch的一些经验,我整理了一些可以作为参考的标准。现在而言没有严格的JSR-352实现,即使是Spring Batch也还有一段距离,因此现在还没有直接比较实现方案的可能。但是我们依旧可以看看各个实现在每个参考标准上面的比较(下面的标准按照重要性来排序)。
可测试性
Junit 集成测试在不要部署到应用服务器商应该可以跑批处理任务。开发的周期性和测试覆盖的潜力都会提高很多。
组件
一个干净的批处理模型是很好的,但是为了快速开发批处理任务你需要依赖别人写好的稳定的组件。Spring Batch 有很多的这类组件 例如 ItemReaders,ItemWriters,PartitionHandlers 等等对应各类数据和环境。
可观察性
JSR-352 定义了批处理的元数据像 JobExecutions,JobInstances,StepExecutions 等等。应该有一个简单的能以图形化的方式查看这些数据或者起/停批处理任务。Spring Batch 提供了Spring Batch Admin 来实现这个功能。你也可以看看JMX提供的工具。
社区化
一个友好的开发者社区能很大的提高生产能力。看看Google的搜索结果,一个活跃的论坛和Stackoverflow上的活动来检查JSR352实现厂商的产品普及度。
任务继承
这个参考点看起来不是很重要,但是实际上所有Spring Batch项目都在用。大公司里面都有一些通用规则,例如协议监听器,日志初始化,退出代码转换等等等等。开发人员不应该自己添加适当的监听器,应该从父任务里简单的继承过来。然后在很多个类似的任务中用一个父任务来包含所有的公用组件这个功能听起来就比较有道理了。
开源化
开源到底好不好是个争论了很久问题,咱们也别老调重弹了。我个人喜欢开源的东西,因为代码的实现方式对我来说是比较重要的。所以我最起码能检查每一个我选择的开源产品的实现代码。
安全性
安全一直都是很重要的,应该要具备开始和停止任务的用户控制,而且不是所有人能看到批处理的元数据。
可伸缩性选项
可伸缩性是很重要的,我在这里列到第8点才说是因为最重要的伸缩性选项-Local Partitioning 已经包含在JSR -352 里面了。但是还应该有更多的选择 ,例如Spring Batch 提供的 Multi-threaded Step,Remote Partitioning ,Parallel Step,Remote Chunking 等等选项,所以看看你的实现厂商有没有提供其他的伸缩性选项。
可配置性
JSR-352 定义了基于XML的任务设置模型。Spring Batch 提供了基于Java (类型安全的)的配置方式,因此确保了编译期间很多细节问题的处理而且在任意IDE下支持重构。这个参考点对执行批处理任务不是很重要,所以我放在第九位,但是也是个值得拥有的功能点。
可扩展性
扩展性是一个非常重要的参考点,但是我把它放在最后一位是因为JSR-352 的 API 已经提供了基本上全部的用于可扩展的接口,例如启动和停止任务,查看批处理元数据和编写自有组件等等。但是,可能你还是会需要没有被包含在JSR-352标准里面的功能。
10条参考点,有些范围太广太淡,有些又是很必要很实用的,重要性的排序是基于我在一些大公司使用Spring Batch 的经验。你可能会有自己的排序或者有些其他想法,但是你得承认上面得这些参考点都是很重要的。 选择JSR-352的实现厂商应该慎重因为你可能会用很久。我也希望这些参考点在你需要做出选择的时候能帮助你。