单个规则级别的异常处理 - Drools
Exception handling at individual rule level - Drools
如何在 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
来指定要使用什么 class 来处理异常:
KieBaseConfiguration kconfig = new RuleBaseConfiguration();
kconfig.setProperty(ConsequenceExceptionHandlerOption.PROPERTY_NAME, "sample.MyConsequenceExceptionHandler");
然后在创建 KieBase
时使用此 kconfig
对象:
KieSession ksession = kcontainer.newKieBase(kconfig).newKieSession();
虽然我找不到在 kmodule.xml 文件中注册处理程序的声明方式。
希望对您有所帮助,
如何在 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
来指定要使用什么 class 来处理异常:
KieBaseConfiguration kconfig = new RuleBaseConfiguration();
kconfig.setProperty(ConsequenceExceptionHandlerOption.PROPERTY_NAME, "sample.MyConsequenceExceptionHandler");
然后在创建 KieBase
时使用此 kconfig
对象:
KieSession ksession = kcontainer.newKieBase(kconfig).newKieSession();
虽然我找不到在 kmodule.xml 文件中注册处理程序的声明方式。
希望对您有所帮助,