1

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

当“下载”步骤返回“已停止”状态时,作业应停止。重新启动后,应调用停止通知。

没有分区一切正常。

无分区统计

after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job       batchStatus=STOPPED   exitStatus=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 => STOPPED 并停止。

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

带隔断

在作业开始时,作业调用 -downloadBatchlet => STOPPED 并停止。

重新启动时,作业调用 NO STEPS 并结束。

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

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

1 回答 1

2

分区与顶级批处理/退出状态

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

由于“转换”(到下一步,或在您的情况下停止作业)发生在此处的作业级别,您需要在该步骤的“顶级”设置非默认退出状态,而不仅仅是在每个分区的级别。

如果您想包含对每个分区的状态做出反应的逻辑,一个很好的起点是PartitionAnalyzer#analyzeStatus方法,该方法在每个分区终止时调用。这在“顶级”线程上运行(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 的返回值仅设置分区级别的状态。

分析器可用于“聚合”分区级别的状态,但您需要。如果什么都不做,则步骤级别的退出状态默认为步骤级别的批处理状态,因此如果步骤正常完成,步骤级别的退出状态为 COMPLETED。

于 2018-08-16T11:33:34.350 回答