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執行一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM