在DROOLS DRL文件中触发多个规则

时间:2014-12-24 15:30:27

标签: drools

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

这样的条件
Rule 1 
when 
      field1 == "X"
then
      status == "A"

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

因此,基于变量field1的值,可以执行规则。

现在我有一个包含超过1个值的对象,如List。因此,如果List包含值X和amp; Y,仅应用规则1,然后停止处理。规则2永远不会被触发。

即使1条规则成功,我有什么方法可以让DROOLS继续申请规则吗?

3 个答案:

答案 0 :(得分:2)

在类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

同样,您可以编写另一个测试contains "Y"的规则,只要List<String>包含"X""Y",它就会触发。< / p>

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

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

不需要针对多个规则触发采取特殊预防措施。标准激活session.fireAllRules()将触发,直到所有激活都已处理完毕。

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

答案 1 :(得分:0)

尝试在Drools会话中调用fireAllRules();

它为您提供以下差异:

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

在最后两个差异中,max是要触发的规则的上限。在您的示例中,如果您使用max作为10,则只要符合条件,它就会触发所有10条规则。

请注意:应根据更新后的状态配置规则,使其符合执行条件。请求您查看criteria片段(规则的when条款,并确保它们确实在执行期间得到正面评估。

e.g。如果规则如下所示:

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

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

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

但是如果我们写出像

这样的规则
Rule 1 
when 
  field1 == "X" || field1 == "Y" 
then
  status == "A"

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

如果Rule 1Rule 2field1,则XY这两项规则都有资格。

希望这有帮助。

答案 2 :(得分:-1)

我会给你一些不同的答案,因为我不知道什么是流口水,但我可以告诉你我们是如何用其他语言做的。基本上它需要字符串构建器概念和一些逻辑触点更改。

设置字符串:

string yourLongerStatusStringSetter = '';

完成检查并附加字符串:

规则1 when field1 == "X" then yourLongerStatusStringSetter &= "Meets Status A criteria."

规则2 when field1 == "Y" then yourLongerStatusStringSetter &= " Meets Status B criteria."

继续规则,检查和追加(符合条件)

输出您的状态&#39;

howeverYouWriteYourOutput( yourLongerStatusStringSetter )

将打印到屏幕上:

Meets Status A criteria. Meets Status B criteria

只是在另一种方法上思考。