• Drools学习教程


    在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执行一次
    
  • 相关阅读:
    USB Descriptors
    回车(carriage return : \r) 换行(line feed : \n)
    SQLSERVER改变已有数据表中的列
    SQLSERVER数据库中的5173错误
    SQLSERVER 在局域网使用Windows身份验证连接局域网内的另一台SQL服务器(不是域环境)
    对于索引假脱机的一点理解
    SQLSERVER备份系统数据库以及何时备份系统数据库
    SQL PROMPT5.3.4.1的一些设置选项
    设置SQLSERVER的错误日志数量和查找SQLSERVER安装错误日志
    谈谈我是如何学习SQL Server的
  • 原文地址:https://www.cnblogs.com/lonecloud/p/12354018.html
Copyright © 2020-2023  润新知