Java 分区的批处理步骤 returns 错误的 batchStatus 和 exitStatus

Java Batch Step with partition returns wrong batchStatus and exitStatus

我在 JDL 中有一个(非常简单的)java 批处理作业,只需两个步骤。

当步骤 "download" return 状态 "STOPPED" 作业应该停止。 重新启动后应调用停止通知。

没有分区一切正常。

没有分区的统计数据

after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job       batchStatus=STOPPED   exitStatus=STOPPED

有了分区,我得到了非常奇怪的批量结束退出状态。 如果下载步骤 returns "STOPPED",作业不会停止。 即使分区只有一个线程和一个分区。

尝试重新启动时出现以下错误(当然)。 JBERET000609:作业执行 1 已经完成,无法重新启动。

分区统计

after step=download batchStatus=STARTED   exitStatus=null
after job=job       batchStatus=COMPLETED exitStatus=COMPLETED

职位描述

<job id="job" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0" restartable="true">
    <step id="download" next="notify">
        <batchlet ref="downloadBatchlet">
        </batchlet>
        <partition>
            <mapper ref="basicPartition" />
        </partition>
        <stop on="STOPPED" restart="notify"/>
    </step>
    <step id="notify">
        <batchlet ref="notifyBatchlet"></batchlet>
        <end on="COMPLETED"/>
    </step>
</job>

欢迎提出建议。我缺少什么?

无分区

作业开始时调用 - downloadBatchlet => 已停止 和停止。

重新启动时作业调用 - notifyBatchlet => 完成 并结束。

有分区

作业开始时调用 - downloadBatchlet => 已停止 和停止。

重新启动作业调用 没有步骤 并结束。

@Named
public class DownloadBatchlet extends AbstractBatchlet {
    @Override
    public String process() throws Exception {

        return BatchStatus.STOPPED.toString();
    }
    @Override
    public void stop() throws Exception {
    }
}

分区与顶层 Batch/Exit 状态

在 Java 批处理中,步骤本身和每个分区都有单独的批处理和退出状态。

由于 "transitioning"(到下一步,或者停止作业,在你的情况下)发生在作业级别,你需要在 "top level" 的步骤,而不仅仅是在每个分区的级别。

如果您想要包含对每个分区的状态做出反应的逻辑,一个好的起点是 PartitionAnalyzer#analyzeStatus 方法,该方法在每个分区终止时被调用。这在 "top level" 线程上运行(与 PartitionReducer 一样)。

简单示例分析器

public class MyPartitionAnalyzer extends AbstractPartitionAnalyzer {

    @Inject
    private StepContext stepCtx;

    @Override
    public void analyzeStatus(BatchStatus batchStatus, String exitStatus) throws Exception {

        // Overrides default exit status if non-COMPLETED partition seen
        if (!exitStatus.equals(BatchStatus.COMPLETED)) {
            stepCtx.setExitStatus(exitStatus);
        }
    }
}

您可以使用您想要对分区的批处理和退出状态作出反应(或不作出反应)的任何逻辑。这里的关键是分析器在顶级步骤线程上运行,因此设置了步骤级别的状态。另一方面,batchlet 的 return 值仅设置分区级状态。

分析器可以根据需要用于 "aggregate" 分区级状态。如果什么都不做,步级退出状态默认为步级批处理状态,所以如果步骤正常完成,步级退出状态为COMPLETED。