【问题标题】:Drools execute one rule for each rule table inside of decision table excelDrools 为决策表 excel 中的每个规则表执行一个规则
【发布时间】:2022-09-24 00:16:11
【问题描述】:

我正在为决策表 excel 中的每个规则表的第一个匹配规则寻找退出的可靠解决方案,

目前excel中有2个规则表,这是因为第一个规则表中更新了一个字段,而第二个规则表使用了更新后的值,

我尝试下面的代码,但它只在第一个规则表中触发一个规则,而不执行第二个规则表中的任何规则,所以它没有帮助,

kieSession.fireAllRules(1);
  • 您是否尝试过使用modify 更改工作内存中的数据(从而允许触发第二组规则),或者将您的表分成不同的组(议程/规则流,甚至单独的 kiebases)并分别触发它们?
  • 是的,我使用修改更新来更改数据,但这与我的问题无关,而且我不使用议程,而不是单独的 kiebase,我正在考虑它,但我认为应该有一个解决方案,
  • 修改和更新是不同的事情,它们的工作方式不同。

标签: drools


【解决方案1】:

考虑为所有规则分配相同的activation-group,然后通过显着性或适当的机制在它们之间分配正确的优先级。

参考https://docs.drools.org/7.73.0.Final/drools-docs/html_single/index.html#rules-attributes-ref_drl-rules

【讨论】:

    【解决方案2】:

    你打电话给fireAllRules(1);1 表示您只会触发一条规则。如果要触发 2 条规则,则需要不传递任何值并使用 fireAllRules(),或者显式调用 fireAllRules(2)。整数表示允许的最大匹配数(规则命中)——如果你将它限制为 1,你将永远只有最多单个规则触发器;将其撞到 2 意味着您将获得 0、1 或 2 次点击。

    现在处理“第一张桌子”和“第二张桌子”,这是一个设计问题。一种选择是将它们作为单独的 KieBase 加载,您可以轻松地通过不同的会话顺序触发它们。显然,您需要将修改后的数据从第一个会话复制到第二个会话的输入。

    或者,您可以使用 Drools 提供的其他内置分组机制。 @tarilabs 在他们的回答中建议 activation-group,这是一个不错的选择,因为它只允许在该组中触发单个规则。将所有“第一桌”规则放在一个激活组下,将所有“第二桌”规则放在第二组下,然后按顺序触发它们。还有agenda-groups,如果你想对“只有一条规则”的限制稍微宽松一点,但仍然需要不同的组一次运行一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-08
      • 2015-08-03
      • 1970-01-01
      • 2011-06-20
      • 2022-11-30
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多