微服务实战:规则引擎Drools

1. 概述

* 规则引擎核心思想:将应用程序中的业务决策部分分离出来
  
* 使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效

 2. 执行流程

drools规则引擎由以下三部分构成:

 Working Memory(工作内存)
 Rule Base(规则库)
 Inference Engine(推理引擎)

其中Inference Engine(推理引擎)又包括:

 Pattern Matcher(匹配器) 具体匹配哪一个规则,由这个完成
 Agenda(议程)
 Execution Engine(执行引擎)

3. Drools基础语法

3.1 规则文件

在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl

 3.2 语法结构

* 规则体语法结构 开始位置 rule,结束位置 end
  
* 结构组成:

rule "ruleName"
    attributes
    when
        LHS 
    then
        RHS
end

rule:关键字,表示规则开始,参数为规则的唯一名称。

attributes:规则属性,是rule与when之间的参数,为可选项。

when:关键字,后面跟规则的条件部分。

LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。 (左手边)

then:关键字,后面跟规则的结果部分。

RHS(Right Hand Side):是规则的后果或行动部分的通用名称。 (右手边)

end:关键字,表示一个规则结束。

3.3 模式匹配

rule "rule_1"
    when
        $order:Order(amout >100 && amout < 500)
    then
        $order.setScore(100);
         System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

 3.4 内置方法

Drools提供了一些方法可以用来操作工作内存中的数据,**操作完成后规则引擎会重新进行相关规则的匹配,**原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。

修改 update方法
update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。

参数:

//Fact对象,事实对象
Order order = new Order();
order.setAmout(30);

规则:

rule "order_rule_1"
    when
        $order:Order(amout < 100)
    then
        $order.setAmout(150);
        update($order)
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

rule "order_rule_2"
    when
        $order:Order(amout >= 100 && amout < 500)
    then
        $order.setScore(100);
        System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

添加 insert方法

insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配

rule "order_rule_1"
    when
        $order:Order(amout < 100)
    then
        Order order = new Order();
        order.setAmout(150);
        insert(order);
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

rule "order_rule_2"
    when
        $order:Order(amout >= 100 && amout < 500)
    then
        $order.setScore(100);
        System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

删除 retract方法

retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。

//规则一:100元以下 不加分
rule "order_rule_1"
    when
        $order:Order(amout < 100)
    then
        retract($order)      //retract方法的作用是删除工作内存中的Fact对象,会导致相关规则重新匹配
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

 4. Drools规则属性

4.1 salience属性

salience属性用于指定规则的执行优先级,取值类型为Integer。数值越大越优先执行
没有添加执行优先级,执行由上到下执行

package com.order

rule "rule_1"
    salience 9
    when
        eval(true)
    then
        System.out.println("规则rule_1触发");
end

rule "rule_2"
    salience 10
    when
        eval(true)
    then
        System.out.println("规则rule_2触发");
end

rule "rule_3"
    salience 8
    when
        eval(true)
    then
        System.out.println("规则rule_3触发");
end

 4.2 no-loop属性

no-loop属性用于防止死循环

//订单积分规则
package com.order
import com.atguigu.drools.model.Order

//规则一:100元以下 不加分
rule "order_rule_1"
    no-loop true         //防止陷入死循环
    when
        $order:Order(amout < 100)
    then
        $order.setScore(0);
        update($order)
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

 5. Drools高级语法

global关键字用于在规则文件中定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。
语法结构为:global 对象类型 对象名称

//订单积分规则
package com.order
import com.atguigu.drools.bean.Order1

global com.atguigu.drools.bean.Integral integral;

//规则一:100元以下 不加分
rule "order_rule_1"
    no-loop true         //防止陷入死循环
    when
        $order:Order1(amout < 100)
    then
        integral.setScore(10);
        update($order)
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

食懵你啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值