有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

并发Java批处理:如何以编程方式确定正在运行的分区?

JSR-352批处理中,我想使用分区。我可以通过配置或实现^{}来定义分区的数量

然后,有^{}^{}可注入项为我的处理提供上下文信息。但是,没有PartitionContext之类的东西来维护和提供有关我正在运行的分区的详细信息

因此,问题是:

如何告诉区块的每个分区实例它运行在哪个分区中,以便它的ItemReader只能读取属于该特定分区的项目

如果我不这样做,每个分区将对相同的数据执行相同的工作,而不是将输入数据集拆分为n个不同的分区

我知道我可以在分区计划的属性中存储一些ID,然后我可以使用这些ID在步骤的配置中设置另一个属性,如<property name="partitionId" value="#{partitionPlan['partitionId']}" />。但这似乎过于复杂和脆弱,因为我必须从分区计划中知道属性的名称,并且必须记住在每个步骤中始终将另一个属性设置为该值

难道没有另一种干净、标准的方法为步骤提供分区信息吗

或者,我应该如何按分区分割工作并将其分配给同一分区块中的不同ItemReader实例

更新:

jberet似乎具有org.jberet.cdi.PartitionScopedCDI作用域,但它不是JSR标准的一部分


共 (1) 个答案

  1. # 1 楼答案

    使用分区计划(XML)或分区映射器(编程)定义分区时,将这些信息作为分区属性,然后在项目读取器/处理器/写入器属性中引用这些分区属性

    这是告诉item reader和其他批处理工件要处理的资源、开始位置和结束位置的标准方法。这与非分区块配置没有太大区别,在非分区块配置中,还需要使用批属性配置输入数据的源和范围

    例如,请从一个jberet测试应用程序中org.jberet.test.chunkPartitionFailComplete.xml