如何在Liberty Profile中获取IBM JSR 352 JSL的decision ID?
获取JSR352 Decision ID的两种方法(Liberty Profile)
针对你在Liberty上运行JSR352批处理时,无法从JobContext或StepContext获取Decision ID的问题,这里有两种可行的解决方案:
方法1:使用Liberty的扩展DeciderContext API
Liberty的JSR352实现提供了一个私有扩展接口com.ibm.jbatch.container.api.DeciderContext,可以直接获取当前Decision的ID,这是最简便的方式:
- 在你的
StepDecider实现类中注入DeciderContext:import com.ibm.jbatch.container.api.DeciderContext; import javax.batch.api.Decider; import javax.batch.runtime.StepExecution; import javax.batch.runtime.JobExecution; import javax.inject.Inject; public class IfConditionalStepDecider implements Decider { @Inject private DeciderContext deciderContext; @Override public String decide(StepExecution stepExecution, JobExecution jobExecution) throws Exception { // 直接获取当前Decision的ID String decisionId = deciderContext.getDecisionId(); System.out.println("当前执行的Decision ID: " + decisionId); // 输出 condition_FTP // 你的原有条件判断逻辑... if (/* 你的STEP2结果判断 */) { return "SHOULD_EXECUTE"; } else { return "SHOULD_SKIP"; } } }
注意:这是IBM Liberty专属的扩展API,若后续迁移到其他JSR352实现(如GlassFish)则无法使用,但在Liberty环境下无需额外依赖,直接可用。
方法2:通过Decision Properties手动传递ID(标准API兼容)
如果需要保持代码的标准JSR352兼容性,不受限于特定容器,可以在JSL中显式传递Decision ID:
修改你的JSL配置,添加自定义属性传递ID:
<decision id="condition_FTP" ref="ifConditionalStepDecider"> <properties> <property name="IF_CONDITIONS" value='{"conditions": [ "STEP2,=,0" ]}'/> <!-- 手动传入当前Decision的ID --> <property name="DECISION_ID" value="condition_FTP"/> </properties> <next on="SHOULD_EXECUTE" to="STEP03" /> <next on="SHOULD_SKIP" to="intermediateStep_EMAILERR" /> </decision>在Decider中读取该属性:
import javax.batch.api.Decider; import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.JobExecution; import javax.batch.runtime.JobInstance; import javax.batch.runtime.StepExecution; import java.util.Properties; public class IfConditionalStepDecider implements Decider { @Override public String decide(StepExecution stepExecution, JobExecution jobExecution) throws Exception { JobOperator jobOperator = BatchRuntime.getJobOperator(); JobInstance jobInstance = jobExecution.getJobInstance(); // 获取Job参数(包含Decision中定义的properties) Properties jobParams = jobOperator.getParameters(jobInstance.getInstanceId()); String decisionId = jobParams.getProperty("DECISION_ID"); System.out.println("当前执行的Decision ID: " + decisionId); // 输出 condition_FTP // 你的原有条件判断逻辑... if (/* 你的STEP2结果判断 */) { return "SHOULD_EXECUTE"; } else { return "SHOULD_SKIP"; } } }
补充:如果Job中有多个Decision,建议给每个Decision的属性加上唯一前缀(如
condition_FTP_ID),避免属性名冲突。
内容的提问来源于stack exchange,提问作者Java guy
相关产品推荐
相关产品推荐

