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 提供补偿逻辑..