drools-规则属性

结构

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细节划分的话

  1. 声明
  2. 属性
  3. 条件
  4. 动作
  5. 结束

现在关注的是规则其中的属性

属性

控制开关

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
// 在某些场合下,选择方便使用的方言

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值