提问者:小点点

在DROOLSDRL文件中触发超过1个规则


我有一个包含10条规则的drl文件。每个都有一个条件,比如-

Rule 1 
when 
      field1 == "X"
then
      status == "A"

Rule 2
when 
      field1 == "Y"
then
      status == "A"

所以根据变量field d1的值看到规则将被执行。

现在我有一个包含超过1个值的对象,例如List。所以如果List包含两个值X

有什么方法可以让DROOLS继续应用规则,即使一个规则是成功的?


共3个答案

匿名用户

编写与类Type中的String字段(称为field)匹配的规则的正确方法是

rule "match field"
when
    Type( field == "X" )
then
    //...
end

您可以编写另一个与"Y"匹配的规则,如果您需要做其他事情,则会指示该规则。如果你想做同样的事情,你可以编写一个稍微复杂一点的测试:

rule "match field"
when
    Type( field == "X" || == "Y" )
then
    //...
end

(是的,这种不寻常的语法在Drools的DRL语言中是允许的。)

要测试List中包含的值,您可以编写

rule "match list element"
when
    List( this contains "X" )
then
    //...
end

同样,您可以编写另一个规则来测试是否包含“Y”,只要List

工作记忆中的裸列表通常不是一个好主意。但是如果一个类成员是一个List,可以使用类似的形式:

rule "match value in list member"
when
    Type( list contains "X" )
then
    //...
end

对于多个规则触发不需要采取特殊的预防措施。标准激活session. fire All规则()触发,直到所有激活都被处理完。

一些规则属性可能会过早终止激活的处理——谨慎使用它们。

匿名用户

尝试调用fire All规则(); Drools会话中可用的

它为您提供以下差异:

        fireAllRules();
        fireAllRules(AgendaFilter agendaFilter) 
        fireAllRules(AgendaFilter agendaFilter, int max)
        fireAllRules(int max)

在最后两个方差中,max是要触发的规则的上限。在您的示例中,如果您使用max作为10,它可以触发所有10条规则,前提是它们满足条件。

请注意:规则的配置方式应使其有资格根据更新的状态执行。要求您查看规则的标准片段(规则的子句,并确保它们在执行期间确实导致正面评估。

例如。如果规则如下所示:

Rule 1 
when 
  field1 == "X"
then
  status == "A"

Rule 2
when 
  field1 == "Y"
then
  status == "A"

然后field d1=="X"为真或field d1=="Y"为真,因此将在MAX触发一条规则。

但是如果我们把规则写成

Rule 1 
when 
  field1 == "X" || field1 == "Y" 
then
  status == "A"

Rule 2
when 
  field1 == "X" || field1 == "Y" 
then
  status == "A"

然后,如果field d1XY,则规则1规则2都将符合条件。

希望这有帮助。

匿名用户

我要给你一个不同的答案,因为我不知道drools是什么,但我可以告诉你我们在其他语言中是如何做到这一点的。基本上它需要一个字符串生成器概念和一些逻辑接触点的变化。

设置您的字符串:

string yourLongerStatusStringSetter = '';

完成检查并附加字符串:

规则1当field d1=="X"时,则yourLongerStatusStringSetter

规则2当field d1=="Y"时,则yourLongerStatusStringSetter

继续规则和检查并追加(前提是满足条件)

输出您的“状态”:

无论如何YouWriteYourOutput(yourLongerStatusStringSetter)

将打印到屏幕上:

符合A级标准。符合B级标准

只是另一种方法的思考食粮。