当前位置: 首页 > 知识库问答 >
问题:

Drools fire会话中包含多个事实的所有规则,如何知道哪个事实失败了

公孙志
2023-03-14

我正在向drools会话插入多个事实并在会话上调用fire All规则。如果任何一个事实失败,则会引发异常,并且不会为其余事实执行规则。

我的问题是:

  1. 即使有一个事实失败,是否有办法继续执行剩余的事实

//我的scala代码段:

val ruleSession:KieSession = kBase.newKieSession();

ruleSession.insert(fact1);
ruleSession.insert(fact2);
ruleSession.insert(fact3);

ruleSession.fireAllRules()
ruleSession.dispose()

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

共有2个答案

徐卓
2023-03-14

这应该符合第一个要求。

val ruleSession:KieSession = kBase.newKieSession();

ruleSession.insert(fact1);
ruleSession.fireAllRules()

ruleSession.insert(fact2);
ruleSession.fireAllRules()

ruleSession.insert(fact3);
ruleSession.fireAllRules()

ruleSession.dispose()
印辉
2023-03-14

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

//Drools会话创建

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();

//ConsequenceExceptionHandler实现。

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.
                }
            }
        //}
    }
}
 类似资料:
  • 我不知道为什么,但JBehave没有考虑给定故事中的失败。如果givenstory出现故障,它将不执行该故事的其余步骤,但将执行给定故事的其余部分。下面是一个例子: 例如,如果Story2.story失败,我预计给定故事的其余部分和最后2个步骤都没有执行。但事实的确如此。 有人知道为什么吗?如果一个步骤或故事失败,我怎么能让所有故事都失败? 我还注意到,报告的统计数据只反映了最后一个给定的故事和后

  • 在我的Jenkins管道中,我通常使用< code>post声明函数向我发送电子邮件,以防管道出现故障。 函数的简单语法如下: 在上面的电子邮件中,我还想提到管道的哪个阶段(假设管道有5到6个阶段)失败了。我该怎么做?任何帮助都非常感谢。 上述要求的扩展将是向用户提供实际的错误日志(失败阶段的错误日志),也作为失败通知电子邮件的一部分。 想法是,当用户收到来自 jenkins 的失败通知时,他应该

  • 是否可以使用Hibernate Spring对以下内容进行建模。 公开会议 我使用Spring TransactionTemplate,它同时执行会话事务生存期范围。 原因是,有时我在业务流程中有几个阶段,我希望在每个阶段完成后提交。但是,我希望继续使用相同的持久对象。如果每个事务都有一个单独的会话,则会出现暂时/分离的异常,因为原始会话已关闭。 这有可能吗?

  • 我有一个问题,如果我的服务上有一个客户端调用两个方法,它就会失败,因为第二个方法中的事务没有与之关联的会话。但是,如果我将这两种方法组合到服务中,并从客户机代码中调用其中一种方法,它就会成功。 谁能给我解释一下为什么会这样? 考虑下面的代码: 所以这里发生的事情是,在我的客户机代码中(它不知道事务),如果我调用#getChildrenFor(id),我就没事了。但如果我打电话: 然后hiberna

  • 在规则执行期间,我将在内存中“插入”新的事实对象,当规则触发完成时,我需要读取这些对象。在规则课程之外,我如何阅读这些事实? 我尝试过从会话外部(即在“fire All规则()”方法之前)使用outIdfier插入事实。但是,因为我可能不知道在规则会话期间可能会插入多少Account ing周期事实,或者即使它会被插入,这种方法似乎不合适。 会计期间事实: 执行代码: 我的规则。drl公司