在Drools中如何在单个规则级别捕获和处理异常?

目的是单个规则的例外不应影响其余规则的执行。

我知道我们可以在RHS中使用try catch,但是无论LHS或RHS是什么,我们都可以在更高级别上进行控制。

就像是:

fireAllRules( new DefaultAgendaEventListener() {
    @Override
        public void whenExceptionAtRule(Exception exception) {
            //handle exception when
        }
})

最佳答案

首先,您需要实现org.kie.api.runtime.rule.ConsequenceExceptionHandler接口:

package sample;

public class MyConsequenceExceptionHandler implements ConsequenceExceptionHandler {

    @Override
    public void handleException(Match match, RuleRuntime rr, Exception excptn) {
        //Do whatever you want
    }

}


然后,这完全取决于您如何创建KieBases。如果您手动执行此操作(不使用kmodule.xml文件),则需要创建KieBaseConfiguration以指定要用于处理异常的类:

KieBaseConfiguration kconfig = new RuleBaseConfiguration();
kconfig.setProperty(ConsequenceExceptionHandlerOption.PROPERTY_NAME, "sample.MyConsequenceExceptionHandler");


然后在创建kconfig时使用以下KieBase对象:

KieSession ksession = kcontainer.newKieBase(kconfig).newKieSession();


但是,我找不到在kmodule.xml文件中注册处理程序的声明方式。

希望能帮助到你,

09-25 20:18