首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带分区的Java批处理步骤返回错误的batchStatus和exitStatus

带分区的Java批处理步骤返回错误的batchStatus和exitStatus
EN

Stack Overflow用户
提问于 2018-08-16 09:22:35
回答 1查看 725关注 0票数 1

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

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

没有分区,一切都能正常工作。

没有分区的统计数据

代码语言:javascript
复制
after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job       batchStatus=STOPPED   exitStatus=STOPPED

通过分区,我得到了批结束退出的真正奇怪的状态。如果下载步骤返回“已停止”,则作业不会停止。即使分区只有一个线程和一个分区。

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

分区统计量

代码语言:javascript
复制
after step=download batchStatus=STARTED   exitStatus=null
after job=job       batchStatus=COMPLETED exitStatus=COMPLETED

作业描述

代码语言:javascript
复制
<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 =>停止并停止。

在重新启动作业时,调用、无步骤、和ends。

代码语言:javascript
复制
@Named
public class DownloadBatchlet extends AbstractBatchlet {
    @Override
    public String process() throws Exception {

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 11:33:34

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

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

由于“转换”(在您的情况下是为了停止作业)发生在这里的作业级别,所以您需要在步骤的“顶层”设置一个非默认的退出状态,而不仅仅是在每个分区的级别。

如果您想包含对每个分区的状态作出反应的逻辑,那么最好的起点是PartitionAnalyzer#analyzeStatus方法,它在每个分区结束时被调用。这在“顶级”线程上运行(与PartitionReducer一样)。

简单示例分析器

代码语言:javascript
复制
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);
        }
    }
}

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51873668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档