变量
drl
package com.sample
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
// 设置全局变量,需外部传入
// 局部变量就不说了,哪都有用着的
global com.sample.Person person;
rule "global_test"
when
eval(true)
then
// 打印全局变量
System.out.println("inner : " + person.toString());
// 全局变量直接修改,不需要更新操作
person.setName("judas");
end
java
public static final void main(String[] args) {
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
// 构造全局对象
Person person = new Person();
person.setName("godme");
// 插入全局对象,通过全局变量名传入对象
ksession.setGlobal("person", person);
ksession.fireAllRules();
// 外部通过变量名获取全局变量
Object outter = ksession.getGlobal("person");
// 打印检测
System.out.println("outter : " + outter);
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
类声明
内部使用
drl
package com.sample
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
// declare基础结构
/*
1. 声明
2. 属性
3. 结束
基本结构如下
declare className
@metaAttr(metaValue)
attr:type @metaAttr(metaValue)
end
其中主要注意三点
1. className即类名
2. 属性先名称后类型,用冒号隔开(typeScript?)
3. 元数据
属性声明习惯就好,元数据当做注解理解就行,仍然有这几个特点
1. 修饰对象
1. 直接写在属性级别表示修饰声明类
2. 写在属性后表示修饰属性
2. 取值
没有赋值,后跟括号,直接写里面即可
3. 操作
除了些特殊的元数据,基本没作用(遇见再说)
(后续应该和注解一样可以自定义?)
*/
declare Actor
@auth(godme)
name:String @maxLength(5)
age:int
birth:java.util.Date
end
rule "declare_test"
when
eval(true)
then
Actor actor = new Actor();
// 根据规范,自带get和set方法
actor.setName("godme");
actor.setAge(22);
actor.setBirth(new Date());
// toString自带
System.out.println(actor.toString());
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();
} catch (Throwable t) {
t.printStackTrace();
}
}
外部调用
drl
package com.sample
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
declare Actor
@auth(godme)
name:String @maxLength(5)
age:int
birth:java.util.Date
end
rule "declare_test"
when
$actor:Actor()
then
System.out.println($actor.toString());
end
java
public static final void main(String[] args) {
try {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
// 知识库获取类型
// 1. 知识库,而不是session
// 2. 两个字符串:包名 和类名
FactType type = kbase.getFactType("com.sample", "Actor");
// 反射一般的用法
Object object = type.newInstance();
// 设置对象,指定设置属性(python setattr ? )
type.set(object, "name", "godme");
type.set(object, "age", 23);
type.set(object, "birth", new Date());
// 都是键值对,干脆Map设置
Object object2 = type.newInstance();
HashMap<String, Object> attrMap = new HashMap<>();
attrMap.put("name", "fucker");
attrMap.put("age", 99);
attrMap.put("birth", new Date());
type.setFromMap(object2,attrMap);
// 插入
ksession.insert(object);
ksession.insert(object2);
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.
Actor( name=fucker, age=99, birth=Thu Aug 30 14:27:50 GMT+08:00 2018 )
Actor( name=godme, age=23, birth=Thu Aug 30 14:27:50 GMT+08:00 2018 )
方法定义
drl
package com.sample
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
// 1. function 关键字,声明方法
// 2. 函数名称和块声明(大括号,不再是end了)同java
function start(){
System.out.println("start");
}
// 3. 空返回值void,不写默认为void
function void over(){
System.out.println("over");
}
// 4. 可以传入参数,进行操作
function void show(String $message){
System.out.println($message);
}
// 5. 支持多参
// 6. 可以有返回值
function int add(int a, int b){
return a + b;
}
rule "declare_test"
when
eval(true);
then
// 调用
start();
int $sum = add(46,54);
show("sum : " + $sum);
over();
end
// 其实只有两个变化,其他的全是java方法的套路
// 1. 修饰符统一用function替换(public?private?protected?synchornized?finl?)
// 2. void可省略
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();
} 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.
start
sum : 100
over