You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,这是最简便的方式:

  1. 在你的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:

  1. 修改你的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>
    
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:03:43