Java 单个规则级别的异常处理-Drools

Java 单个规则级别的异常处理-Drools,java,drools,Java,Drools,如何在Drools中捕获和处理单个规则级别的异常 目的是单一规则的例外不应影响其余规则的执行 我知道我们可以在RHS中使用try-catch,但无论LHS或RHS是什么,我们都可以在更高的级别上进行控制 比如: fireAllRules( new DefaultAgendaEventListener() { @Override public void whenExceptionAtRule(Exception exception) { //hand

如何在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
    }

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

KieBaseConfiguration kconfig = new RuleBaseConfiguration();
kconfig.setProperty(ConsequenceExceptionHandlerOption.PROPERTY_NAME, "sample.MyConsequenceExceptionHandler");
然后在创建
KieBase
时使用此
kconfig
对象:

KieSession ksession = kcontainer.newKieBase(kconfig).newKieSession();
但是,我找不到在kmodule.xml文件中注册处理程序的声明方式


希望有帮助,

谢谢!!这适用于RHS。但是如何在LHS捕捉运行时异常(“当”规则的一部分,其中将有一个布尔表达式)?据我所知,
LHS
中的异常无法处理。即使可以处理它们,
LHS
中的异常也可能使RETE网络处于不一致状态。好的实践表明
LHS
应该只进行模式匹配。您能解释一下您在规则的
LHS
中做了什么吗?有时LHS包含诸如
Double.parseDouble(payment)>0等表达式。这涉及的风险包括付款不是数字而是字符串。此特定情况不能通过使用
Double.parseDouble
来处理,而可以使用安全的自定义实用程序方法。但总有可能出问题。是吗?***[在阅读了关于RETE的内容后]**更具体地说,在我的例子中,我使用Drools的情况与通常使用的情况稍有不同。我不希望在某些更改碰巧是业务对象时触发规则。但我将业务对象传递给所有规则,其中一些规则最终会转换对象状态,而另一些则不会,仅此而已。