【问题标题】:How to validate which condition in the drools rule is failing?如何验证 drools 规则中的哪个条件失败?
【发布时间】:2021-05-20 16:55:46
【问题描述】:

我正在使用 drools 7.44 并且有一个包含 20 多个规则的包。目前我面临的问题是有时我希望触发的某些规则没有触发。 在 then 我可以添加日志语句,但不能在 when 中。 有没有办法调试或记录规则的哪些条件失败?

如果客户年龄=21,性别=男性,并且使用以下规则。我如何在运行时确定性别是导致规则不触发的标准。

rule "some rule"
    when
        $c : Customer(age>18 , gender == "female" )
    then
........
        do something here
        log.debug("something to log") 
end

这是一个简单的例子来说明问题。理想情况下,我们有多个条件。

【问题讨论】:

  • 您想要日志记录解决方案还是调试解决方案?您可能想开始记录您的实际规则命中,看看是否首先触发的东西可能会在输入上调用 retract 或修改它们或其他东西。
  • 基本上我想知道为什么某个规则条件没有被评估,这样我就可以指出确切的条件。

标签: drools rules


【解决方案1】:

使用DebugAgendaEventListener 跟踪规则评估。见manual

这将仅涵盖匹配成功的情况。如果不是,则不会评估任何内容。有一个JIRA 来跟踪此类失败的评估

手册摘录

Drools 引擎还支持以下议程和工作 用于调试日志的内存事件监听器:

DebugAgendaEventListener DebugRuleRuntimeEventListener

这些事件侦听器实现了相同的受支持事件侦听器 方法并默认包含调试打印语句。您可以添加一个 要监视和记录的特定支持事件,或监视 所有议程或工作记忆活动。

例如,以下代码使用 DebugRuleRuntimeEventListener 监听并打印所有工作内存事件的事件监听器:

监控和打印所有工作内存事件的示例代码

ksession.addEventListener( new DebugRuleRuntimeEventListener() );

【讨论】:

  • 这并没有具体提到哪个条件失败。
  • 我明白你的观点@Technical101,但在执行过程中我们无法追踪模式是否匹配:输出太冗长而无法理解。如果你想知道哪里不匹配,我建议你去底层,用调试器进入AlphaNodeassertMethod方法。
  • 问题是想在运行时这样做。
  • @Technical101 我为此提交了一个 JIRA issues.redhat.com/browse/DROOLS-6368
  • 谢谢@Luca Molteni
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2017-09-24
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多