流口水在会话中用多个事实触发所有规则,如何知道哪个事实失败了



我正在流口水会话中插入多个事实,并在会话上调用fireAllRules。如果任何一个事实失败,则会引发异常,并且不会对其余事实执行规则。

我的问题是:

  1. 没有办法继续执行剩余的事实,即使一个事实失败了?
  2. 有没有办法知道插入会话的多个事实中失败的事实?

我的 scala 代码片段:

val ruleSession:KieSession = kBase.newKieSession();
ruleSession.insert(fact1);
ruleSession.insert(fact2);
ruleSession.insert(fact3);
ruleSession.fireAllRules()
ruleSession.dispose()

让我知道任何有用的想法。谢谢

正如上面的注释(通过Prog_G(中的链接所说,我实现了 ConresultExceptionHandler 并在 handleException 方法中优雅地处理了异常,我记录了失败的事实并将其从执行进一步的规则中删除,下面给出了示例代码。希望这对有类似用例的人有所帮助。

流口水会话创建

KieBaseConfiguration kconfig = new RuleBaseConfiguration();
kconfig.setProperty(ConsequenceExceptionHandlerOption.PROPERTY_NAME, "com.xxx.RuleExceptionHandler"); // set my exception handler name to RuleBaseConfiguration
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kieBase = kContainer.newKieBase("ims-hw-rules",kconfig); // create KieBase passing the config
KieSession kSession = kieBase.newKieSession();

//ConresultExceptionHandler Implementation.

public class RuleExceptionHandler implements ConsequenceExceptionHandler{
@Override
public void handleException(Match match, RuleRuntime workingMemory, Exception exception) {
//if(exception instanceof MyException) {
if(match.getObjects().size() >0) {
for (Object object : match.getObjects()) {
JSONData fact = (JSONData) object;
//logFailedFact(fact);
}
}
if(match.getFactHandles()!= null) {
for (FactHandle factHandle : match.getFactHandles()) {
workingMemory.delete(factHandle); // delete the failed fact from executing remaining rules.
}
}
//}
}
}

这应该符合第一个要求。

val ruleSession:KieSession = kBase.newKieSession();
ruleSession.insert(fact1);
ruleSession.fireAllRules()
ruleSession.insert(fact2);
ruleSession.fireAllRules()
ruleSession.insert(fact3);
ruleSession.fireAllRules()
ruleSession.dispose()

最新更新