Java 单个规则级别的异常处理-Drools
如何在Drools中捕获和处理单个规则级别的异常 目的是单一规则的例外不应影响其余规则的执行 我知道我们可以在RHS中使用try-catch,但无论LHS或RHS是什么,我们都可以在更高的级别上进行控制 比如:Java 单个规则级别的异常处理-Drools,java,drools,Java,Drools,如何在Drools中捕获和处理单个规则级别的异常 目的是单一规则的例外不应影响其余规则的执行 我知道我们可以在RHS中使用try-catch,但无论LHS或RHS是什么,我们都可以在更高的级别上进行控制 比如: fireAllRules( new DefaultAgendaEventListener() { @Override public void whenExceptionAtRule(Exception exception) { //hand
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的情况与通常使用的情况稍有不同。我不希望在某些更改碰巧是业务对象时触发规则。但我将业务对象传递给所有规则,其中一些规则最终会转换对象状态,而另一些则不会,仅此而已。