结构
package com.godme.rules; // package
import com.godme.Person; // import
global Person person; // global
function func(){} // function
query // query
rule "ruleName" //rule
np-loop true // attr
when
condition //condition
then
action // action
end
drl文件基本就这几部分
- package 打包
- import 导入
- global 全局
- function 函数
- query 查询
- rule
rule细节划分的话
- 声明
- 属性
- 条件
- 动作
- 结束
现在关注的是规则其中的属性
属性
控制开关
enable boolean
// 表示该规则是否可用
// true : 可用
// false: 不可用
// 默认 : true 可用
重复执行
no-loop boolean
// 是否重复执行
// 一般只要发现满足条件的规则,都会进行执行
// 那么,重复的数据,重复的更新也会导致重复的执行
// no-loop true,默认可重复
// no-loop false,设置之后对于同一个对象,规则只执行一次
// 注意
// 禁止重复的是对象,而不是规则
// 禁止后效果是执行过规则的对象不会再次执行,而不是执行过的规则不再执行
drl
package com.sample
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
rule "find"
duration 3000
when
$person:Person()
then
System.out.println($person.getName());
end
java
public static final void main(String[] args) {
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Person person1 = new Person();
Person person = new Person();
person.setName("godme");
person1.setName("judas");
ksession.insert(person);
ksession.insert(person1);
ksession.fireAllRules();
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
效果
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
godme
judas
优先级
salience num
// 优先级大小,数字越大,优先级越高
// 数字num为大于等于0的正整数
// 默认为0
// 规则执行顺序按照优先级从大到小执行
// 同优先级随机顺序
// 不设置默认优先级为 0
有效时间
// date格式 dd-MM--yyyy 29-AUG-2018
date-effective date
// date-effective 生效时间
// 当前时间大于等于指定date,规则有效
// 当前时间小于指定date,规则无效
date-expires date
// date-expires 失效时间
// 当前时间小于等于指定date,规则有效
// 当前时间大于指定时间,规则失效
//若指定
date-effective date_start
date-expires date_end
// 有效时间date范围为
// date_start <= date <= data_end
延时执行
duration time
// time为延时时间,正整数,单位毫秒
// 规则执行时间过长时使用该属性,该属性有如下两个特点
// 1. 延时
// 2. 新线程
// 延时执行的运行环境是新开的线程
例子
drl
package com.sample
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
rule "find"
duration 3000
when
eval(true)
then
System.out.println(new SimpleDateFormat("yyyy-MM HH:mm:ss").format(new Date()) + " == " + Thread.currentThread().getId());
end
java
public static final void main(String[] args) {
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
ksession.fireAllRules();
logger.close();
System.out.println(new SimpleDateFormat("yyyy-MM HH:mm:ss").format(new Date()) + " == " + Thread.currentThread().getId());
} catch (Throwable t) {
t.printStackTrace();
}
}
结果
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2018-08 15:42:16 == 1
2018-08 15:42:18 == 10
多选一执行
activaction-group string
// 激活分组,属性为字符串,表示分组名称
// 同一组的规则,只能有一个被执行,其他的不生效
// 通过设置salience优先级指定规则执行,此时只执行优先级最高的规则
// 如果优先级一致,或者不设置优先级,默认都为0,则随机挑选一个执行
分组与焦点
agenda-group string
// 同激活分组,也表示分组
// string处是分组名称,字符串类型
// 在过滤前,规则标识为agenda分组,必须获取焦点才能够进行执行
// 设置焦点有两个办法
// 1. 代码设置
// 2. 规则自动获取焦点
// 规则自动获取焦点
auto-focus boolean
// auto-focus false,不自动获取焦点
// auto-focus true, 自动获取焦点
// 默认为false,不会默认获取焦点,想要执行必须设置属性或代码直接设置
代码设置焦点
public static final void main(String[] args) {
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
// 通过组名获取组,然后setFocus设置焦点
ksession.getAgenda().getAgendaGroup("agend_group_name").setFocus();
ksession.fireAllRules();
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
重复执行
lock-on-active boolean
// no-loop强化版本,转本针对于agend-group和ruleflow-group
// 默认为false
方言
dialect language
// 方言,可以直接写在规则drl文件当中的编程语言
// 比如我们在文件当中常用的System.out.println()
// 目前支持方言仅两种
// 1. java
// 2. mvel
// 默认java
// 在某些场合下,选择方便使用的方言