【Drools学习笔记篇】-【Drools属性大全】

320 阅读4分钟

Drools规则属性:

位置:rule~when之间

  • no-loop 防止死循环

    • 默认值: false
    • 类型: Boolean
    • 如果设置了此属性那么可以有效的避免死循环,当规则体中执行了Update等可以修改Fact对象内容的函数时,则规则体会被再次激活,重新匹配规则,如果条件满足那么就会一直循环。
  • ruleflow-group 所属组

    • 默认值:
    • 类型: String
    • 设置此属性表示该规则目前所属组,当所关联的组被激活时才会执行该规则。
  • lock-on-active 锁定活跃

    • 默认值: false
    • 类型: Boolean
    • 此属性可以理解为解决死循环的必杀技,因为如果将值设置为true 时那么此规则只会执行一次,就算是通过ruleflow-grop 属性所激活也不会执行。当然值得注意的是此属性仅仅适用于规则流组ruleflow-group和议程组agenda-group中的规则,如果你不希望Fact对象中的内容经常变化的话,那么此属性用来计算是最好不过的了。
  • salience 优先级

    • 默认值: 0
    • 类型: number
    • 此属性是用来设置规则执行的顺序,值越大优先级越高,越先执行。当然负数也是支持的。
  • enabled 是否被激活

    • 默认值: true
    • 类型: Boolean
    • 此属性可以用来控制该规则是否可以执行或者不执行。
  • dialect 方言

    • 默认值: Mvel
    • 类型: 字符串
    • 此属性是用来指定规则要使用的语言类型,可以是JAVA 也可以是MVEL ,当使用MVEL 方言是该规则使用在包级别指定的方言,此处指定的任何方言都会覆盖该规则的包方言(官方),在我的理解就是如果你默认不指定方言为MVEL 时,后面在指定自己的方言时则会覆盖之前的方言。
  • date-effective 时间限制

    • 默认值:
    • 类型: date类型的字符串
    • 设置此属性时,指定时间后,只有当系统时间大于等于设置的时间时才会激活该规则。默认情况下日期格式为:dd-MMMM-yyyy
  • date-expires 时间限制

    • 默认值:

    • 类型: date类型的字符串

    • 设置此属性时,指定时间后,只有在该时间之前该规则才会生效,晚于当前时间或系统时间就会实失效。当然如果你想自定义日期格式,你可以这么做:

      System.setProperty("drools.dateformat","yyyy-MM-dd"); // 必须放在kieServices前面
      KieServices kieServices = KieServices.Factory.get();
      KieContainer kieContainer = kieServices.getKieClasspathContainer();
      KieSession kieSession = kieContainer.newKieSession("hellodrools")
      
  • duration 定时器

    • 默认值:
    • 类型: Long
    • 该属性以毫秒为单位,设置该属性值时如果规则体满足条件,可以激活规则的持续时间。
  • timer 间隔 | 计时器

    • 默认值:

    • 类型: 字符串

    • 通过该属性可以设置规则间隔多久执行一次,或者通过cron 表达式来计时执行规则。

      rule "Hello"
          timer(int: 30s) // 每次执行间隔30秒
          timer(int: 30s; start=开始时间, end=结束时间, repeat-limit=50)  //repeat-limit 重复执行的次数
          timer(cron: * 0/15 * * * ?) // 每15分钟执行一次
          when
          then
      end
      

      当然你也可以使用declare关键字声明来通过变量使用

      declare bean 
          delay: String = "30s"
          period: Long = 1000
      end  
      ​
      rule "Hello"
          timer(expr: $d,$p)
          when
              bean($d: delay, $p: period)
          then
              System.out.println("规则执行了");
      end
      
  • activation-group 激活分组

    • 默认值:
    • 类型: 字符串
    • 通过设置相同分组的名称,在同一组的规则只能一条规则执行,如果没有设置优先级那么在前面的规则执行,如果设置了优先级那么优先级高的规则执行。
  • agenda-group 议程组

    • 默认值:

    • 类型: 字符串

    • 如果议程组的名称相同那么获得焦点的议程组中的所有规则都会执行,获得焦点的方式有两种,一是通过auto-focus 属性指定规则自动获得焦点。二是在代码中设置。

       kieSession.getAgenda().getAgendaGroup("议程组名称").setFocus();
      
      • 指的注意的是:如果和activation-group 属性共同使用时并且都是同一组名,那么只有一条规则执行。如果存在优先级那么优先级高的会执行,如果没有设置那么会从上到下执行。除此之外只有获得焦点才会执行
  • auto-focus 自动获得焦点

    • 默认值: false
    • 类型: Boolean
    • 此属性和议程组配合使用效果会更好,而且好像也专门为它而存在。
  • calendar 日期

    • 默认值:

    • 类型: 字符串

    • 用于调度规则的Quartz日历定义

      示例:(calendars "* * 0-7,18-23 ? * *" 不包括非工作时间)
      

下篇文章将从规则引擎的中级语法开始