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。
我在 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。