• Drools规则引擎入门指南(二)


    本篇博客主要讲解Drools常用的属性以及函数

    属性

    首先我们在resources ules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTests

    1. salience优先级

    salience 属性的值默认为0,它的值越大执行的优先级就越高,看如下代码在执行的时候就会先执行salience2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     rule "salience2"
    salience 2
    when
    eval(true)
    then
    System.err.println("salience2");
    end

    rule "salience1"
    salience 1
    when
    eval(true)
    then
    System.err.println("salience1");
    end
    1
    2
    3
    4
    @Test
    public void testSalience() {
    kieSession.fireAllRules();
    }

    2. date-effective日期比较(小于等于)

    当系统时间小于等于date-effective的值是才会执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     rule "dateEffective"
    date-effective "2018-11-24"
    when
    then
    System.err.println("2018-11-24被执行");
    end

    rule "dateEffectiveTomorrow"
    date-effective "2018-11-25"
    when
    then
    System.err.println("2018-11-25被执行");
    end
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Test
    public void testDateEffective() {
    kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("dateEffective"));
    }

    @Test
    public void testDateEffectiveTomorrow() {
    kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("dateEffectiveTomorrow"));
    }

    由于今天是11月24,所以上方的dateEffectiveTomorrow将不会执行。

    还有需要注意的是Drools默认的时间格式是dd-MMM-yyyy的,也就是说你必须使用24-十一月-2018它才能识别,我为什么能使用yyyy-MM-dd呢,请参考上篇文章中进行自动配置时的getKieServices()方法

    3. date-expires日期比较(大于)

    刚好于date–effective相反

    4. enabled

    当一个规则的enabled属性变为false时这条规则将不再可用

    1
    2
    3
    4
    5
    6
    rule "enabled"
    enabled false
    when
    then
    System.err.println("被禁用的规则");
    end
    1
    2
    3
    4
    @Test
    public void testEnabled() {
    kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("enabled"));
    }

    函数

    接着我们在resources ules文件夹下创建一个Function.drl,还有一个DroolsApplicationFunctionTests

    Drools中常用函数分别为insert、update和retract,分别是插入更新和删除,我们来看一下下方的几个规则的执行过程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    rule "test1"
    when

    then
    insert(new User("赵六",12));
    System.err.println("创造赵六");
    end

    rule "test2"
    when
    $u:User(name=="赵六")
    then
    $u.setName("王五");
    update($u);
    System.err.println("赵六");
    end

    rule "test3"
    when
    $u:User(name=="王五")
    then
    System.err.println("王五");
    retract($u);
    end

    rule "test4"
    when
    $u:User(name=="王五")
    then
    System.err.println("王五删除删除之后"+$u.getName());
    end

    可用看的,test1规则没有判断条件,所以直接被执行,执行过程中它生成了一个对象插入到工作内存中,此对象的规则又恰好与test2规则匹配,所以紧接着test2执行,test2执行时更新了user对象,更新后的对象又匹配了test3,所以test3继续执行。执行完毕后user对象被删除,test4就执行不了了。

    另外还有几个方法也是常用的:

    1. getWorkingMemory,获取当前的WorkingMemory对象
    2. halt,执行完当前规则后不再执行其他规则
    3. getRule,获取当前规则对象

    本文所有源码:https://github.com/shiyujun/drools

    本文出自http://zhixiang.org.cn/,转载请保留

  • 相关阅读:
    leetcode1627 带阈值的图连通性
    leetcode402 移掉k位数字
    Python-Hello world!
    初识Python-Python介绍
    Python初探-购物车程序
    初识Docker
    Mybatis的工作原理
    Mybatis的逆向工程
    Mybatis的简介
    常量、变量&数据类型
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/10112059.html
Copyright © 2020-2023  润新知