停用 drools 中的规则流组

如何解决停用 drools 中的规则流组

我有一个 drl 文件,其中包含 2 个规则流组中的规则: "first-ruleflow-group" 和 "second-ruleflow-group" 。这些组的激活取决于“规则 A”和“规则 B”。有什么方法可以在规则 A 条件匹配时停用规则 B 以触发,以便将焦点仅设置为“first-ruleflow-group”?

rule "rule A"
    when
        eval(true);
   then
        drools.setFocus("first-ruleflow-group");
end

rule "rule B"
    when
        eval(true);
   then
        drools.setFocus("second-ruleflow-group");
end

解决方法

根据排他性条件更改规则。

简单的例子。假设我们有一个处理日历事件的应用程序。我们有公共假期的规则流程。我们有宗教节日的规则流程。有一些宗教节日也是公共假日;对于这些,我们只想取消公共假期规则。

rule "Public Holidays"
when
  Holiday( isPublic == true )
then
  drools.setFocus("publicholiday-flow");
end

rule "Religious Holidays"
when
  Holiday( isReligious == true,isPublic == false )
then
  drools.setFocus("religiousholiday-flow");
end

所以,基本上,修改你的“规则 B”以包含一个否定规则 A 条件的条件,这样如果规则 A 匹配,规则 B 必然不匹配。


第二种解决方案是在您的第一个规则流(由 A 触发)中设置一个条件,使规则 B 不会触发。除了阻止规则 B 触发的条件是动态的之外,它与之前的解决方案基本相似。

举个例子,假设有一个应用程序可以确定某人的停车费。停车费是按天设定的——周一到周五有一个费率,周六有一个费率,周日免费。此外,还有其他折扣 - 例如老年人,或者如果总停车时间少于 5 分钟。星期几费率使用第一个规则流 (A) 确定,折扣使用第二个规则流 (B) 确定。如果是星期天,就没有理由触发第二组规则。

您可以编写折扣规则流触发器以明确不会在星期日触发,或者您可以让星期日费率规则收回或插入数据,从而使折扣规则不再有效运行。

rule "Day Rates"
when
then
  drools.setFocus("dayrates-flow");
end

rule "Discounts"
when
  exists(Rate( hourly > 0 ))
then
  drools.setFocus("discounts-flow");
end

// The Sunday rule,part of the dayrates-flow,sets hourly = 0,which makes
// the "Discounts" rule no longer valid to fire.
rule "Sunday Rate"
ruleflow-group "dayrates-flow"
when
  not(Rate())
  Request( day == DayOfWeek.SUNDAY ) // when parking on Sunday...
then
  Rate rate = new Rate();
  rate.setHourlyRate(0.0);
  insert(rate);
end

另一种选择是从第一个规则流中触发第二个规则流,但仅在需要时才触发。

重复使用前面的停车示例:

rule "Day Rates"
when
then
  drools.setFocus("dayrates-flow");
end


// Here are some day rate rules. Most are omitted for brevity. We include three (3)
// to show regular rates,the special case of Sunday,and how we trigger the discount
// rate rules

rule "Saturday Rate"
ruleflow-group "dayrates-flow"
when
  not(Rate())
  Request( day == DayOfWeek.SATURDAY )
then
  Rate rate = new Rate();
  rate.setHourly(1.0); // Saturday rate: $1/hr
  insert(rate);
end

rule "Sunday Rate"
ruleflow-group "dayrates-flow"
when
  not(Rate())
  Request( day == DayOfWeek.SUNDAY )
then
  Rate rate = new Rate();
  rate.setHourlyRate(0.0); // Sunday rate: free
  insert(rate);
end

// This rule only triggers the next rule flow when the rate is positive (eg not Sunday)
rule "Transition to Discounts"
ruleflow-group "dayrates-flow"
when
  exists(Rate( hourly > 0 ))
then
  drools.setFocus("discount-flow");
end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?