Drools规则格式仅触发一次

时间:2014-05-27 18:57:04

标签: java drools rule-engine

我正在使用drools 6引擎。假设我有一个帐户对象,其中包含一系列部分,每个部分都有一个状态标志,可以是" GOOD"或者"坏"。如果我要撰写以下内容:

rule "Check if account has a good subsection"
when
    $account : Account()
    SubSection (status == "GOOD") from $account.getSubSections()
then
    insertLogical(new AccountIsGood($account));
end

如果至少有一个部分是好的,我希望这只是添加逻辑规则AccountIsGood($account)。但是,似乎这不仅仅检查一个成功的子部分并结束规则,而是继续检查所有子部分并为每个有效子部分插入逻辑规则。例如,如果一个帐户有四个有效的小节,我会获得该帐户的四个规则副本。

所以我的问题是,是否有办法重写此规则以获得所需的行为?

帐户类:

public class Account {
  private List<SubSection> subsections;

  // Getters / Setters/ other code
}

1 个答案:

答案 0 :(得分:5)

尽可能简化规则。虽然可以检查是否存在插入的AccoundIsGood(),但建议编写逻辑,以便仅测试单个良好子部分的存在。此外,您需要from从Account对象中提取子部分。

rule testForGood
when
  $account: Account( $sub: subsections )
  exists SubSection( status == "GOOD" ) from $sub
then
  insertLogical( new AccountIsGood($account) );
end

保留insertLogical可能是一个好主意,如果分段状态可能会改变远离&#34; GOOD&#34;:如果accound没有&,那么逻辑插入的事实将被撤回#39; t至少有一个好的部分。