Drools 规则引擎的使用

1、首先引入drools依赖包

dependency>
	<groupId>org.kie</groupId>
	<artifactId>kie-api</artifactId>
	<version>7.7.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-core</artifactId>
	<version>7.7.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-compiler</artifactId>
	<version>7.7.0.Final</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-templates</artifactId>
	<version>7.7.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-decisiontables</artifactId>
	<version>7.7.0.Final</version>
</dependency>

2、编写执行规则通用方法

public class DroolsExecutorUtil {
    /**
     * 执行定义的规则
     * @param bo 柜子模型
     * @param rule 规则方法
     * @param <T> 返回执行结果
     * @return
     * @throw Exception
     */
    public static <T> T executeRule(T bo, String rule) throws Exception {
        if(StringUtils.isEmpty(rule)){
            return bo;
        }
        KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
        //以DRL形式加载规则
        kb.add(ResourceFactory.newByteArrayResource(rule.getBytes(StandardCharsets.UTF_8)), ResourceType.DRL);
        KnowledgeBuilderErrors errors = kb.getErrors();
        for (KnowledgeBuilderError error : errors) {
            throw new Exception("规则文件执行错误:"+ error.getMessage());
        }
        InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
        kBase.addPackages(kb.getKnowledgePackages());
        //获取规则引擎会话session
        KieSession kieSession = kBase.newKieSession();
        //插入需匹配的对象
        kieSession.insert(bo);
        //执行规则
        kieSession.fireAllRules();
        //释放资源
        kieSession.dispose();
        return bo;
    }
}

3、创建实体类Order

public class Order {
    /**
     * 订单原始价格(即优惠前的价格)
     */
    private Double  originalPrice;
    /**
     * 订单真实价格(即优惠后的价格)
     */
    private Double realPrice;

    ......此处省略get/set方法
}

4、编写规则(以.drl文件形式编写)

package order.impl
import com.example.demo.test.Order

// 规则一:价格在100元以下,无优惠
rule "rule_1"
    lock-on-active true
    when
        $order: Order(originalPrice < 100) // 匹配模式,到规则引擎中(工作内存)查找Order对象,命名为$order
    then
        $order.setRealPrice($order.getOriginalPrice());
        update($order);
        System.out.println("匹配到规则一,价格在100元以下,无优惠");
end

// 规则二:价格在100~200之间,优惠20元
rule "rule_2"
    lock-on-active true
    when
        $order: Order(originalPrice >= 100 && originalPrice < 200)
    then
        $order.setRealPrice($order.getOriginalPrice() - 20);
        update($order);
        System.out.println("匹配到规则二,价格在100~200之间,优惠20元");
end

// 规则三:价格在200~300元之间,优惠50元
rule "rule_3"
    lock-on-active true
    when
        $order: Order(originalPrice >= 200 && originalPrice < 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 50);
        update($order);
        System.out.println("匹配到规则三,价格在200~300元之间,优惠50元");
end

// 规则四:价格在300元及以上,优惠100元
rule "rule_4"
    lock-on-active true
    when
        $order: Order(originalPrice >= 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 100);
        update($order);
        System.out.println("匹配到规则四,价格在300元及以上,优惠100元");
end

5、进行测试

public static void main(String[] args) throws Exception {
    String rule = "";//此部分为上面写的规则,进行复制即可
    Order order = new Order();
    order.setOriginalPrice(160d);
    System.out.println("匹配规则前优惠后价格:" + order.getRealPrice());
    DroolsExecutorUtil.executeRule(order,rule);
    System.out.println("优惠前价格:" + order.getOriginalPrice() + "\n优惠后价格:" + order.getRealPrice());
}    

6、查看日志输出

匹配规则前优惠后价格:null
匹配到规则二,价格在100~200之间,优惠20元
优惠前价格:160.0
优惠后价格:140.0

介绍

package:package是必须定义的,必须放在规则文件第一行,package的名字可以是随意起的
import:导入规则文件需要使用到的外部规则文件或者变量
rule:定义一个具体规则,rule "ruleName",一个规则可以包含三个部分:
    属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。

    条件部分(LHS):定义当前规则的条件,如 when Message(); 判断当前workingMemory中是否存在Message对象。

    结果部分(RHS):即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。这里可以写普通java代码。

rule "ruleName"
     no-loop true

     when
         $message:Message(status == 0)

     then
         System.out.println("fit");
         $message.setStatus(1);
         update($message);
end

属性详情
    no-loop:定义当前的规则是否不允许多次循环执行,默认是false;
    lock-on-active:lock-on-active true 通过这个标签,可以控制当前的规则只会被执行一次
    date-expires:设置规则的过期时间,默认的时间格式:“日-月-年”
    date-effective:设置规则的生效时间,时间格式同上。
    duration:规则定时,duration 3000,3秒后执行规则
    salience:优先级,数值越大越先执行,这个可以控制规则的执行顺序

具体相关属性详情可参考:https://www.jianshu.com/p/697b756b7453

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Drools是一种常用的规则引擎,它是一个业务规则管理系统。规则引擎可以存储和配置业务规则数据,并对输入的数据进行规则校验,最后输出符合规则的数据。在Drools中,可以使用一些关键字和语法来编写规则。 一些常用的关键字和语法包括: - in / not in 关键字,用于指定数据在某个集合中或不在某个集合中的条件。 - eval关键字,用于在LHS执行时进行条件判断,如果条件为true,则执行规则;如果条件为false,则不执行规则。 - exists关键字,用于判断工作内存中指定的对象是否存在,如果存在则执行规则,否则不执行规则。 - extends关键字,用于规则的继承,如果父规则触发了,那么子规则也会触发,两个规则必须同时满足才会执行。 - halt方法,当某一个规则调用了该方法,该规则下面所有的规则都不会执行,不管是否条件满足。 一个简单的规则示例可以是: ```java rule "规则1、如果订单金额大于1000则触发此规则" when $order: OrderDTO(price > 1000) then System.out.println("规则1触发了,金额大于了1000元,当前的金额为:" + $order.getPrice()); end ``` 这个规则表示如果订单金额大于1000,则打印出触发的信息。 总之,Drools规则引擎可以通过编写规则来对数据进行规则校验和处理,具体的规则语法和关键字可以根据需求灵活运用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [熟练使用Drools规则引擎](https://blog.csdn.net/m0_45245077/article/details/126290776)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值