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