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

带有分区的Java批处理步骤返回错误的batchStatus和exitStatus,java,spring-batch,java-batch,jberet,Java,Spring Batch,Java Batch,Jberet,我在JDL中有一个(非常简单的)java批处理作业,只需两个步骤 当步骤“下载”返回“已停止”状态时,作业应停止。 重新启动后,应调用停止通知 没有分区,一切正常 没有分区的统计信息 after step=download batchStatus=COMPLETED exitStatus=STOPPED after job=job batchStatus=STOPPED exitStatus=STOPPED after step=download batchStatus=STA

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

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

没有分区,一切正常

没有分区的统计信息

after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job       batchStatus=STOPPED   exitStatus=STOPPED
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>
有了分区,我得到了批处理结束退出的真正奇怪的状态。 如果下载步骤返回“STOPPED”,则作业不会停止。 即使分区只有一个线程和一个分区

尝试重新启动时,会引发以下错误(当然)。 JBERET00609:作业执行1已完成,无法重新启动

具有分区的统计信息

after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job       batchStatus=STOPPED   exitStatus=STOPPED
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>
工作描述

after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job       batchStatus=STOPPED   exitStatus=STOPPED
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>
分区与顶级批处理/退出状态 在Java批处理中,步骤本身和每个分区都有一个单独的批处理和退出状态

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

如果您想包含对每个分区的状态做出反应的逻辑,那么一个好的起点是方法,该方法在每个分区终止时调用。这在“顶级”线程上运行(就像PartitionReducer一样)

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


分析器可以用来“聚合”分区级别的状态。如果不执行任何操作,则步骤级退出状态默认为步骤级批处理状态,因此,如果步骤正常完成,则步骤级退出状态为完成。

Thx非常感谢您的回答,但我没有得到它。如果没有分区,转换效果非常好。当添加只有一个线程和一个分区的分区时,重新启动时转换将不再工作。你说我必须更改是什么意思?你是如何在你的batchlet中设置退出状态的?对于这个用例和当前测试目的,我总是将batchlet中的状态设置为STOPPED。我已将batchlet添加到上述查询中。谢谢你的帮助。更新了答案。很高兴能帮上忙。是的,检查退出状态更适合您的起始代码。说得好。调整了我的答案。