ODM 8.5.1中的异常处理

时间:2015-08-27 15:33:35

标签: rule-engine ilog

我正在尝试按照以下URL在ODM 8.5.1中实现异常处理,但无法在IlrContext类中找到setExceptionHandler方法。

请帮我详细说明实施过程,或提供我可以参考的更好的示例代码。

http://www-01.ibm.com/support/docview.wss?uid=swg21400651

http://www-01.ibm.com/support/knowledgecenter/SSQP76_8.5.0/com.ibm.wodm.dserver.rules.designer.run/executing_engine_topics/tsk_rulesetexec_set_handler.html

1 个答案:

答案 0 :(得分:1)

我不确定你的意思是“找不到setExceptionHandler”方法,但我附上了一些代码片段,所以这可能有助于澄清。

可以使用两种不同的异常处理程序,具体取决于您使用的规则算法的类型。

如果您使用的是RetePlus,则可以使用属于IlrContext类(IlrContext javadoc)的setExceptionHandler

这个代码看起来像:

package com.ibm.sample.exceptionHandler;

import ilog.rules.engine.IlrExceptionHandler; import ilog.rules.engine.IlrUserRuntimeException;

public class ruleHandler implements IlrExceptionHandler {

public ruleHandler(){   
}
@Override
public boolean handleException(IlrUserRuntimeException ex) {
    // TODO Auto-generated method stub
    if(ex.isInConditions()){
        System.out.println("Caught by rule handler");
        return false;
    }else{
        throw ex;
    }
}

}

并且会捕获规则的条件部分中抛出的任何异常(再次使用RetePlus时)。

您可以在执行前将其添加到引擎中 - 使用生成的RuleEngineRunner类 - 只需添加:

IlrContext engine = new IlrContext(ruleset);
**engine.setExceptionHandler(ruleHandler);**

RuleflowExceptionHandler类似于FastPath和Sequential,但为您提供了更多选项来确定发生异常的位置(请记住RetePlus的ExceptionHandler仅在规则本身中)。

public ruleFlowHandler(){
}
@Override
public boolean handleException(IlrUserRuntimeException ex) {
    // TODO Auto-generated method stub
    if(ex.isInConditions()){
        System.out.println("Condition error caught by ruleflow handler");
        return false;
    }else{
        if(ex.isInternal()){
            System.out.println("internal exception caught by ruleflow handler");
            return false;               
        }else{
            if(ex.isInActions()){
                System.out.println("Action exception caught by ruleflow handler");
                return false;               
            }else{
                System.out.println("Throw exception");
                return true;
            }
        }

    }
}

如您所见,我们现在可以确定异常是在Ruleflow本身,规则的Condition部分还是规则的Action部分。处理程序的附加方式与ExceptionHandler相同:

  IlrContext engine = new IlrContext(ruleset);
  **engine.setExceptionHandler(ruleFlowHandler);**

这两个调用都将在您的客户端Java代码中。如果你想在通过像HTDS这样的东西运行时添加它们,那么只需创建一个简单的虚拟BOM条目,将处理程序添加到当前上下文中。

在我的示例中,我的静态方法的BOM / XOM映射代码如下所示:

context.setExceptionHandler(new ruleHandler());
context.setRuleFlowHandler(new ruleFlowHandler());

我从RuleFlow的Initial Action调用了代码。在RetePlus的情况下,我只需添加一个规则集变量,该变量在输入规则集时将构造异常处理程序。

在所有情况下,请确保异常处理代码位于规则集/应用程序的类路径中。