当前位置: 首页 > 知识库问答 >
问题:

在流口水时停用规则流组

狄飞鹏
2023-03-14

我有一个drl文件,它在两个规则流组中包含规则:“第一个规则流组”和“第二个规则流组”。这些组的激活取决于“规则A”和“规则B”。是否有任何方法可以停用规则B,以便在规则A条件匹配时触发,从而仅将焦点设置为“第一个规则流组”?

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

共有1个答案

呼延博易
2023-03-14

改变你的规则依赖于排他性条件。

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

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
 类似资料:
  • 我不太会流口水和咕噜。 我有一个关于规则流的基本问题。 我在guvnor插件上使用引导编辑器创建了3条规则。现在我想根据第一条规则的结果调用第二条或第三条规则。 e、 g.如果患者年龄小于18岁,则进行第二条规则的小检查,否则请调用第三条规则由高级医生进行检查。 那么,这可以通过使用规则流来实现吗?如果是,如何?是否有任何示例链接和文档来演示它?非常感谢您的帮助。 谢啦

  • 我无法从jbpm业务规则任务中触发规则。似乎找不到进程规则文件。试着解释一下。 进程Test.java简单的设置Message和启动进程: 然后,我运行并正确触发脚本任务(“Hello world”),但在RuleGroup1中找不到规则。drl: 跟踪项目文件夹: 谢谢你的帮助。

  • Drools文档提到,规则可以使用诸如生效日期和过期日期之类的属性来指定绝对规则有效期。 例如 Drools还支持周期性重复的规则,间隔为,cron为,但这意味着规则是在这样的点触发的。 我很感兴趣,如果有任何选项如何指定定期可用(不解雇)的规则与时间限制。例如,让我们想象一些公司的营业时间-操作只能在正式工作期间执行,但不能在下班后执行。 我想要这样的东西,但这不是Drools的有效规则 是否可

  • 问题内容: 这是我的流口水验证问题的第二部分。第一部分已经回答,我的代码中已经实现了建议的解决方案。 这是我的java类结构 好的,我的问题是,如果FinanceItemName为“土地或建筑物”,并且该用户的地址符合以下条件,则我需要验证FinanceDetails实例的itemValue, AddressStatus ==当前 AddressType ==物理 AddressUseType =

  • 我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是: