Drools学习教程 - 3. 规则属性

在drools中会有很多属性可供我们选择,有防止死循环的,优先级等

Drools文件中的相关配置属性

属性 作用 默认值
no-loop 防止死循环 false
ruleFlow-group 规则类型 rule:规则 flow:流程 group:分组
lock-on-active 锁定活跃(no-loop相似,但是是其升级版本) false
salience 执行优先级 0
enabled 是否执行 true
dialect 该执行语言类型 java/mvel(由包指定)
date-effective 规则生效时间(dd-MMM-yyyy格式)07-August-2018 N/A
date-expires 规则失效时间(dd-MMM-yyyy格式)07-August-2018 N/A
duration 定时器(废弃)代替->time属性 N/A
activation-group 激活分组,具有相同组名称的规则体有且只有一个规则被激活(选择哪个按照优先级) N/A
agenda-group 议程分组,可以在代码中控制执行哪个规则 无,基于代码设置
auto-focus 自动获取焦点,当前规则是否激活
timer 控制规则执行时间

no-loop配置

用于防止死循环,当规则调用了update操作的时候,会导致规则的对象再次激活,则可能再次激活对象

  • 默认值:false
  • 类型:boolean
rule "dead2"
  no-loop true
  when
    $p:Person(age==20)
  then
    System.out.println($p);
    $p.setAge(20);
    update($p)
  end

死循环实例

package chp3
import cn.lonecloud.drools.bean.Person;
rule "dead"
  no-loop true
  when
    $p:Person(age==20)
  then
    System.out.println($p);
    $p.setAge(20);
    update($p)
  end

rule "dead2"
  no-loop true
  when
    $p:Person(age==20)
  then
    System.out.println($p);
    $p.setAge(20);
    update($p)
  end

ruleFlow-group

用于表示规则流

  • 默认值:N/A
  • 可选值:
    • rule:规则
    • flow:流程
    • group:分组

lock-on-active

锁定活跃,也就是防止规则出现多次调用,当前规则只能执行一次。保证当前规则在同一个kession 是只会执行一次的。

  • 默认值:false

以下例子就不会出现死循环情况了

package chp3
import cn.lonecloud.drools.bean.Person;
rule "dead"
  no-loop true
  lock-on-active true
  when
    $p:Person(age==20)
  then
    System.out.println($p);
    $p.setAge(20);
    update($p)
  end

rule "dead2"
  no-loop true
  lock-on-active true
  when
    $p:Person(age==20)
  then
    System.out.println($p);
    $p.setAge(20);
    update($p)
  end

salience

优先级,默认是按照从上而下执行规则,该值越大则其优先级越高

  • 默认值:0
  • 类型:integer
  • 规范:可为负数,值越大则其优先级越高
package chp3
rule "salience40"

  salience 40
  when
    eval(true)
  then
    System.out.println("salience40");
  end

rule "salience2"
  no-loop true
  lock-on-active true
  salience 60
  when eval(true)
  then
    System.out.println("salience60");
  end

运行结果:

salience60
salience40

date-effective&&date-expires

  • 作用:用于指定规则的生效和失效时间
  • 默认值:无
  • 默认格式:dd-MMM-yyyy
  • 自定义时间格式:System.setProperty("drools.dateformat","yyyy-MM-dd HH:mm:ss")`

agenda-group 议程分组

Java代码可控的分组执行

drl文件定义

package chp3
rule "agenda"
  agenda-group "demo1"
  salience 40
  when
    eval(true)
  then
    System.out.println("agenda-group");
  end

rule "agenda2"
  agenda-group "demo2"
  salience 60
  when eval(true)
  then
    System.out.println("agenda-group2");
  end

代码执行


        KieSession salience = kieClasspathContainer.newKieSession("salience");
        //设置激活
				salience.getAgenda().getAgendaGroup("demo1").setFocus();
        int salienceCount = salience.fireAllRules();
        System.out.println("一共运行了"+salienceCount+"条规则");

结果

agenda-group

timer属性

用于定时器,支持cron表达式

rule "timer1"
  timer (int: 3s)
  when eval(true)
  then
    System.out.println("3s执行一次");
  end
rule "timer2"
  timer (cron: 0/15 * * * * ?)
  when eval(true)
  then
    System.out.println("15s执行一次");
  end

java

        //定时任务
        KieSessionConfiguration kieBaseConfiguration = kieServices.newKieSessionConfiguration();
        kieBaseConfiguration.setOption(TimedRuleExecutionOption.YES);
        KieSession kieSession = kieClasspathContainer.newKieBase("chp3",KieServices.Factory.get().newKieBaseConfiguration()).newKieSession(
                kieBaseConfiguration, null
        );
        int i1 = kieSession.fireAllRules();

执行结果

3s执行一次
15s执行一次
15s执行一次
15s执行一次
15s执行一次
15s执行一次
15s执行一次
posted @ 2020-02-23 20:23  lonecloud  阅读(1141)  评论(0编辑  收藏  举报
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:lonecloud,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply