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

Drools决策表动作执行顺序

章永安
2023-03-14

我有一个Drools决策表(见下文),其中规则2有一个条件,检查营养分数是否在某个阈值之间,并根据该条件执行操作。有一个初始规则(规则1)执行检查并执行其操作,它更新了我希望规则2在执行其条件时使用的总分。

我的期望/需要:

规则1运行,如果条件满足,则更新$model上的总体分数(通过执行其操作),然后规则2运行,并且对于它的条件,使用由规则1的操作运行更新的更新分数值。

实际发生了什么

规则1运行它的条件,规则2运行它的条件,规则1的动作运行,规则2的动作运行。规则2在规则1的动作运行之前运行它的条件,因此使用过时的分数。

我已经证明(我认为)通过更改优先级/显著性值,我可以更改规则运行其条件的顺序,但似乎所有规则条件都是在操作之前运行的。我希望规则1的操作在下一个规则之前运行。

我是否从根本上误解了这个概念?一个明显的错误?或者,如果有人有一个建议的解决方法,那就太好了。

为了澄清这是一个无状态的ki会话。

提前谢谢,这让我快发疯了!

共有1个答案

程胤运
2023-03-14

Drools的工作原理是预先考虑所有规则并评估其条件是否得到满足。这些规则中的每一条都被称为“匹配”。当您启动规则时,Drools收集所有匹配项,对它们进行排序(自然或显著),然后逐一迭代并执行它们。

当规则执行时,它们可能会像您的示例一样更改工作内存。但是,除非您明确告诉Drools您正在这样做,否则它不会重新评估匹配项。在执行规则时,匹配阶段已经完成。

可以告诉Drools您正在修改工作内存,并且需要它根据新数据重新评估其规则。为此,您需要使用内置方法之一:

 类似资料:
  • 我们在决策表中实现了一个场景,如果某个规则成功地执行了规则的操作部分,就可以退出其余规则的执行。假设我有50条规则,第5条规则表示保险索赔无效,那么我们将索赔设置为对象无效,那么就不需要执行其余的规则。如何才能做到这一点。请建议

  • 当我尝试使用Drools引擎计算保险费时,我有一个潜在的性能/内存瓶颈。 我在我的项目中使用Drools将业务逻辑与java代码分开,我决定也将其用于溢价计算。 我是不是用错了口水 如何以更高性能的方式满足要求 详情如下: 我必须为给定的合同计算保险费。 合约配置有 productCode(来自字典的代码) 合同代码(来自字典的代码) 客户的个人资料(例如年龄、地址) 保险金额(SI) 等等 目前

  • 我有一个drools决策表,其中包含条件和位置类型 我的excel如下所示 设置参数的代码如下 我按要求提供的excel文件条件对象: 需求级别==$参数位置类型==$参数 当我像上面那样设置时,我得到以下错误: 创建KieBase时出错[消息[id=1,级别=错误,路径=规则.xls,行=8,列=0文本=[错误102]行8:14不匹配的输入'=='在规则“替换规则”中],消息[id=2,级别=错

  • 有人能帮我调试Drools中的决策表吗。对于我们的项目,我们正在创建一个包含1000多条规则的决策表。每当他们在规则中出现错误时,谁的电子表格不工作,也不显示准确的错误在哪里。

  • 场景如下: 我有一个java pojo类,具有2个变量和以及适当的getter和setter。我正在使用决策表流,我想要: 条件:当类型设置为“1”时 操作:调用name类的setName setter,并从excel中设置适当的参数 现在,我想在java中访问name的这个集值。 这就是我所做的: Name.java- MainClass.java-这有口水实现!! 决策表e:: http://

  • 我对Drools很陌生,正在尝试编译这个简单的。xls作为决策表,并得到这个非常无用的编译错误:[错误102]第8:1行规则“Patient Notification\u 11”中的输入“then”不匹配 我已经附加了xls以及随之而来的简单对象。我已经阅读了有关此内容的所有材料,但无法弄清楚为什么我会收到以下错误。我很感谢您提前提供帮助。具体来说,我想知道是否有办法检查并查看导致此错误的幕后原因