12.9 扩展 JSR-352 批处理作业
Spring Batch 的 job 有4种扩展方式 (后两种方式支持使用多个JVM来执行):
- Split - 并行执行多个 step.
- Multiple threads - 通过多线程执行单个 step.
- Partitioning - 将数据切分后并行处理 (主从,master/slave).
- Remote Chunking - 远程执行逻辑处理块.
JSR-352 提供了两种扩展批处理的方式。这两种方式都只支持在单个 JVM 中运行:
- Split - 和 Spring Batch 一样
- Partitioning - 在概念上与Spring Batch一样,但实现略有不同。
12.9.1 分区(Partitioning)
从概念上讲, JSR-352的分区是和Spring Batch一样的。传递 元数据(meta-data)给每个 slave 以确定需要处理的输入, 在执行完成后返回结果信息给 master。但他们之间有一些重要的区别:
- Partitioned Batchlet - 这会在多个线程中运行多个配置的 Batchlet 实例. 每个实例都有自己的 properties, 一般通过 JSL 或者 PartitionPlan 设置
- PartitionPlan - 在 Spring Batch 中, 每个分区都有一个 ExecutionContext. 但在 JSR-352 中只提供单个
javax.batch.api.partition.PartitionPlan
, 附带一个 Properties 数组, 存放每个 partition 的 meta-data 信息. - PartitionMapper - JSR-352 提供2种方式来生成分区的 meta-data. 一是通过 JSL (partition 属性). 二是通过 javax.batch.api.partition.PartitionMapper 接口的一个实例. 在功能上, 这个接口类似于 Spring Batch 的
org.springframework.batch.core.partition.support.Partitioner
接口(在其中允许手工生成分区的 meta-data 信息). - StepExecutions - 在 Spring Batch 中, 分区 step 使用主从的方式运行. 在 JSR-352 中,也使用相同的配置. 但是 slave steps 不能获得正式的 StepExecutions. 因此, 调用
JsrJobOperator#getStepExecutions(long jobExecutionId)
方法智慧返回 master 的 StepExecution.
[Note] 提示
子 StepExecution 仍然存在于 job repository 中,可以通过 JobExplorer 和 Spring Batch Admin 来查看/使用.
- 补偿逻辑(Compensating logic) - 因为Spring Batch使用 step 实现了主/从 分区逻辑, 如果出现错误则可以用 StepExecutionListener 来处理补偿逻辑。 JSR-352 提供了一个collection, 用来在其他组件发生错误时提供补偿逻辑, 并动态设置退出状态。这些组件包括:
构件接口(Artifact Interface) | 说明(Description) |
javax.batch.api.partition.PartitionCollector | slave step 可以通过该对象发送消息给 master. 每个 slave 线程都有一个实例. |
javax.batch.api.partition.PartitionAnalyzer | End point, 接收由 PartitionCollector 收集的信息, 以及已完成分区的结果状态. |
javax.batch.api.partition.PartitionReducer | 为分区 step 提供补偿逻辑.. |