使用JSR 352 Batch API是否可以实现以下逻辑?我有一系列步骤,每个步骤都需要根据开始工作时已知的不同条件执行。条件实体由外部系统提供。
public List<Steps> createStepSequence(ConditionsEntity conditions) {
if (conditions.isStep1Enabled()) {
steps.add(step1)
}
if (conditions.isStep2Enabled()) {
steps.add(step2)
}
if (conditions.isStep3Enabled()) {
steps.add(step3)
}
//many more ifs
return steps;
}
我的第一次尝试失败,原因是:com.ibm.jbatch.container.exception.BatchContainerRuntimeException:一个决定不能在另一个决定之前。我在这里添加失败代码
<?xml version="1.0" encoding="UTF-8"?>
<job id="myJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0">
<properties>
<property name="isExecuteStep2" value="false"/>
<property name="isExecuteStep3" value="false"/>
</properties>
<step id="step1" next="decider1">
<batchlet ref="myBatchlet1"/>
</step>
<decision id="decider1" ref="SkipNextStepDecider">
<properties>
<property name="isExecuteNextStep" value="#{jobProperties['isExecuteStep2']}"/>
</properties>
<next on="EXECUTE" to="step2"/>
<next on="SKIP" to="decider2"/>
</decision>
<step id="step2">
<batchlet ref="myBatchlet2"/>
</step>
<decision id="decider2" ref="SkipNextStepDecider">
<properties>
<property name="isExecuteNextStep" value="#{jobProperties['isExecuteStep3']}"/>
</properties>
<next on="EXECUTE" to="step3"/>
<end on="SKIP"/>
</decision>
<step id="step3">
<batchlet ref="myBatchlet3"/>
</step>
</job>
@Named
public class SkipNextStepDecider implements Decider {
@Inject
@BatchProperty
private String isExecuteNextStep;
@Override
public String decide(StepExecution[] ses) throws Exception {
if (isExecuteNextStep.equalsIgnoreCase("true")) {
return "EXECUTE";
} else {
return "SKIP";
}
}
}
看起来失败是由于一个决定在运行时将另一个决定作为下一个执行点而导致的。根据JSR 352规范的第8.5节,它应该是受支持的用例:
作业可以包含任意数量的决策元素。决策要素是作业级步骤,流程中“下一个”属性的目标,分裂或其他决定。
作为一种解决方法,您可以尝试通过一个包含相同条件和逻辑的批处理步骤。例如,
<step id="pass-through-step">
<batchlet ref="PassThroughBatchlet"/>
<next on="EXECUTE" to="step2"/>
<next on="SKIP" to="decider2"/>
</step>