• Drools规则引擎快速入门(一)


    目录

    一、Drools环境集成

    二、drools规则引擎开发实现的具体步骤如下:

    三、drools快速入门

    ?四、开发实现

    第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包

    第二步:根据drools要求在maven项目目录下创建?resources/META-INF/kmodule.xml

    第三步:创建订单实体类Order

    第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:

    第五步:编写测试类TestDrools。


    一、Drools环境集成

    在项目中集成使用drools时,既可以独立使用也可以整合spring使用,如果是单独使用直接引入maven依赖包:如下

        
          org.kie
          kie-spring
          7.68.0.Final
        
        
          org.drools
          drools-compiler
          7.68.0.Final
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果使用的开发工具是IDEA,那么在file->setting目录下

    点击plugins插件市场中搜索安装drools插件 ,如图

    二、drools规则引擎开发实现的具体步骤如下:

    三、drools快速入门

    业务场景描述

    用户消费的金额对应赠送的积分规则情况如下:

    //消费100元以下 不加分

    //消费100元-500元 加100分

    //消费500元-1000元 加500分

    //消费1000元以上 加1000分

    四、开发实现

    第一步:创建maven项目droolsSpring,在创建好的项目pom.xml文件中添加drools依赖包

    第二步:根据drools要求在maven项目目录下创建resources/META-INF/kmodule.xml

    需要有一个配置文件告诉代码规则文件drl在哪里,在drools中这个文件就是kmodule.xml

    
    
    
        
        
            
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注意:配置文件中的名称和位置都是固定写法,不能更改

    Kmodule中可以包含一个到多个kbase,分别对应drl的规则文件。

    kbase需要一个唯一的name,可以取任意字符串。

    packages为drl文件所在resource目录下的路径。注意分区drl文件中的package与此处的package不一定相同。多个包用逗号分隔,默认情况下会扫描resources目录下的所有(包含子目录)规则文件。

    kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称就可以直接查找到该KieBase,但每个module最多只能有一个默认的KieBase。

    kbase下面可以有一个或多个ksession,ksession的name属性必须设置,且必须唯一。

    第三步:创建订单实体类Order

    package com.hx.rules.entity;
    
    import lombok.Data;
    
    @Data
    public class Order {
    
        /**
         * 订单金额
         */
        private int amount;
    
        /**
         * 积分
         */
        private int score;
    
        @Override
        public String toString() {
            return "Order{" +
                    "amount=" + amount +
                    ", score=" + score +
                    '}';
        }
    }
    
    • 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

    第四步:创建规则文件resources/rules/score-rules.drl,规则文件的内容如下:

    package rules;
    
    import com.hx.rules.entity.Order;
    
    //100元以下不加分
    rule "score_1" //名称需唯一
    when
    $order:Order(amount < 100);
    then
    $order.setScore(0);
    System.out.println("触发规则,100元以下不加分");
    end
    
    //100元-500元 加100分
    rule "score_2"
    when
    $order:Order(100 < amount && amount< 500)
    then
    $order.setScore(100);
    System.out.println("触发规则,100元-500元 加100分");
    end
    //500元-1000元 加500分
    rule "score_3"
    when
    $order:Order(500 < amount && amount < 1000)
    then
    $order.setScore(500);
    System.out.println("触发规则,500元-1000元 加500分");
    end
    //1000元以上 加1000分
    rule "score_4"
    when
    $order:Order(1000 < amount)
    then
    $order.setScore(1000);
    System.out.println("触发规则,500元-1000元 加500分");
    end
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    第五步:编写测试类TestDrools。

    情况一:module文件中kbase指定特定名称,并且default设置为true,测试类的代码如下:

    package com.hx.rules;
    
    
    import com.hx.rules.entity.Order;
    import org.junit.Test;
    import org.kie.api.KieBase;
    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    
    public class TestDrools {
    
        @Test
        public void test() {
            //第一步 获取KieServices
            KieServices kieServices = KieServices.Factory.get();
            //第二步获取kieContainer
            KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
            //第三步获取kieSession
            KieSession simpleRuleKSession = kieClasspathContainer.newKieSession();
            //新建事实对象
            Order order = new Order();
            order.setAmount(235);
            //第四步 插入事实对象到session中
            simpleRuleKSession.insert(order);
            //第五步 执行规则引擎
            simpleRuleKSession.fireAllRules();
            //第六步 关闭规则引擎
            simpleRuleKSession.dispose();
            System.out.println("规则执行完成,关闭规则");
        }
    }
    
    • 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
    • 32

    注意:

    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer(); //第三步获取kieSession KieSession simpleRuleKSession = kieClasspathContainer.newKieSession();

    两端代码中的container和kiesession无线指定name也能查找到KieBase

    情况二:module文件中kbase指定特定名称,default未设置或者设置为false,测试类的代码如下:

    package com.hx.rules;
    
    
    import com.hx.rules.entity.Order;
    import org.junit.Test;
    import org.kie.api.KieBase;
    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    
    public class TestDrools {
    
        @Test
        public void test() {
            //第一步 获取KieServices
            KieServices kieServices = KieServices.Factory.get();
            //第二步获取kieContainer
            KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer("SimpleRuleKBase");
            //第三步获取kieSession
            KieSession simpleRuleKSession = kieClasspathContainer.newKieSession("simpleRuleKSession");
            //新建事实对象
            Order order = new Order();
            order.setAmount(235);
            //第四步 插入事实对象到session中
            simpleRuleKSession.insert(order);
            //第五步 执行规则引擎
            simpleRuleKSession.fireAllRules();
            //第六步 关闭规则引擎
            simpleRuleKSession.dispose();
            System.out.println("规则执行完成,关闭规则");
        }
    }
    
    • 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
    • 32

    测试代码中按照注解描述的步骤逐一编写,执行代码得出如下结果:

    看到对应规则输出表示案例测试成功

    Drools规则引擎快速入门(二)_的博客-CSDN博客

  • 相关阅读:
    网络编程(三)UDP TFTP协议
    [spring]spring的使用笔记大全
    Linux.进程操作命令
    day04-1群聊功能
    做自媒体的素材都是在哪里找的呢?
    相控阵天线(六):直线阵列特殊综合方法(变形泰勒综合法、贝利斯综合法、伍德沃德抽样法)
    Flutter 局部刷新
    【创建型模式】建造者模式
    集合的练习题
    LocalStroage,SessionStroage,Cookide,IndexedDB
  • 原文地址:https://blog.csdn.net/m0_67392811/article/details/126031837