drools-自成一派

变量

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值