精华内容
下载资源
问答
  • Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手 Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解 Drools规则引擎 系列教程(四)Drools 主要API & 决策表 教程...

    Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手

    Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解

    Drools规则引擎 系列教程(四)Drools 主要API & 决策表

    教程代码已提交到ytooo-drools,欢迎star

    文中代码方法均基于上一篇教程

    1. .drl文件结构

    • package 包充当每组规则的唯一名称空间。一个规则库可以包含多个程序包。
      通常,将包的所有规则与包声明存储在同一文件中,以便包是独立的。但是,
      也可以在规则中使用从其他的包中导入的对象
    • imports 与Java中的import语句类似,用来标识在规则中使用的任何对象的标准路径和类型名称
    • factions 函数代码块如:
    function String hello(String applicantName) {
        return "Hello " + applicantName + "!";
    }
    
    • queries 在Drools引擎的工作内存中搜索与DRL文件中的规则相关的事实
    query "people under the age of 21"
        $person : Person( age < 21 )
    end
    
    • global 为规则提供数据或服务
    • rules 规则

    1.1 import引入java方法 以及 function

       import & function 在下一节中详细描述 带我飞过去

    1.2 glable 全局变量

       全局变量在下一节中详细描述 带我飞过去

    1.3 querys 查询

       querys查询在下一节中详细描述 带我飞过去

    1.4 declare 自定义fact对象

       declare在下一节中详细描述 带我飞过去

    2.rules 规则

    2.1 drl属性

    属性 描述
    salience 定义规则优先级的整数,数值越大,优先级越高
    enabled 规则启用开关
    date-effective 包含日期和时间定义的字符串。仅当当前日期和时间在date-effective属性之后时,才能激活该规则。
    date-expires 如果当前日期和时间在date-expires属性之后,则无法激活该规则。
    no-loop 选择该选项后,如果规则的结果重新触发了先前满足的条件,则无法重新激活(循环)规则。如果未选择条件,则在这些情况下可以循环规则。
    agenda-group 标识要向其分配规则的议程组
    activation-group 激活组,在激活组中,只能激活一个规则。触发的第一个规则将取消激活组中所有规则的所有未决激活。
    duration 定义了如果仍满足规则条件,则可以激活规则的持续时间(以毫秒为单位)。
    timer cron定时表达式
    calendar 时钟
    auto-focus 仅适用于议程组中的规则。选择该选项后,下次激活该规则时,将自动将焦点分配给分配了该规则的议程组。
    lock-on-active no-loop属性的更强版
    ruleflow-group 标识规则流组的字符串
    dialect 用于标识规则中的代码表达式JAVA或MVEL将其用作语言

    2.2 匹配模式

    2.2.1 没有约束的匹配模式

    实事不需要满足任何条件,若类型相同,则触发该规则,如:

    package com.ytooo.bean
    import com.ytooo.bean.People
    dialect  "java"
    
    rule "girl"
        when
            People()
        then
            System.out.println("girl规则执行");
    end
    
    2.2.2 有条件约束的匹配模式

    实事类型相同,且满足条件,则触发该规则,如:

    package com.ytooo.bean
    import com.ytooo.bean.People
    dialect  "java"
    
    rule "girl"
        when
            People(sex == 0 && drlType == "people")
        then
            System.out.println("girl规则执行");
    end
    
    2.2.3 匹配并绑定属性以及实事

    实事类型相同,且满足条件,则触发该规则,并绑定数据,如:

    package com.ytooo.bean
    import com.ytooo.bean.People
    dialect  "java"
    
    rule "girl"
        when
             $p:People(sex == 0,$sex : sex && drlType == "people")
        then
            System.out.println("girl规则执行");
            System.out.println($p);
            System.out.println($sex);
    end
    

    2.3 条件

    and,or 等结合规则条件的多个模式,没有定义关键字连词,默认是and:

    package com.ytooo.bean
    import com.ytooo.bean.People
    import com.ytooo.bean.Cat
    dialect  "java"
    
    rule "girl"
        when
            People(sex == 0) and
            Cat(sex == 0)
        then
            System.out.println("girl规则执行");
    end
    

    2.4 约束

      标准Java运算符优先级适用于DRL中的约束运算符,而drl运算符除==和!=运算符外均遵循标准Java语义。

      在drl中 Person( firstName != “John” )类似于 !java.util.Objects.equals(person.getFirstName(), “John”)

    约束 描述
    !. 使用此运算符可以以空安全的方式取消引用属性。!.运算符左侧的值不能为null(解释为!= null)
    [] 按List索引访问值或Map按键访问值
    <,<=,>,>= 在具有自然顺序的属性上使用这些运算符
    ==, != 在约束中使用这些运算符作为equals()和!equals()方法
    &&,|| 组合关系条件
    matches,not matches 使用这些运算符可以指示字段与指定的Java正则表达式匹配或不匹配
    contains,not contains 使用这些运算符可以验证Array或字段是否包含或不包含指定值
    memberOf,not memberOf 使用这些运算符可以验证字段是否为定义为变量Array的成员
    soundslike 使用英语发音来验证单词是否具有与给定值几乎相同的声音(类似于该matches运算符)
    in,notin 使用这些运算符可以指定一个以上的可能值来匹配约束(复合值限制)
    2.4.1 约束demo

      来自官方文档

    • matches, not matches
    Person( country matches "(USA)?\\S*UK" )
    Person( country not matches "(USA)?\\S*UK" )
    
    • contains, not contains
    FamilyTree(countries contains "UK" )
    Person( fullName not contains "Jr" )
    FamilyTree(countries contains $var)
    Person( fullName not contains $var )
    
    • memberOf, not memberOf
    FamilyTree( person memberOf $europeanDescendants )
    FamilyTree( person not memberOf $europeanDescendants )
    

    2.5 集合

    2.5.1 from 取集合中的元素
    新建bean Animal
    package com.ytooo.bean;
    import lombok.Data;
    import java.util.List;
    
    /**
     * Created by Youdmeng on 2020/1/7 0007.
     */
    @Data
    public class Animal {
    
        private Integer level;
    
        private List<People> peoples;
    
    }
    
    新建 from.drl
    package com.ytooo.frm
    dialect "java"
    import com.ytooo.bean.People
    import com.ytooo.bean.Animal
    
    rule "from"
    when
        $an : Animal()
        $p : People(sex != 3 && drlType == "from") from $an.peoples
        then
            System.out.println($p);
        end
    
    新建测试方法
    @Test
    public void from() {
        People p1 = new People(1,"达","from");
        People p2 = new People(0,"秋","from");
        People p3 = new People(3,"金","from");
        Animal animal = new Animal();
        animal.setPeoples(new ArrayList<>());
        animal.getPeoples().add(p1);
        animal.getPeoples().add(p2);
        animal.getPeoples().add(p3);
        session.insert(animal);//插入
        session.fireAllRules();//执行规则
    }
    
    执行测试,在三组数据中,2个people满足条件,执行两次
    People(sex=0, name=秋, drlType=from)
    People(sex=1, name=达, drlType=from)
    
    2.5.2 collect

      从指定来源或从Drools引擎的工作内存中获取集合,可以使用Java集合(例如List,LinkedList和HashSet)

    新建 collect.drl
    package com.ytooo.collt
    dialect "java"
    import com.ytooo.bean.People
    import java.util.List
    
    rule "collect"
     when
        $alarms : List( size >= 3 ) from collect(People(sex != 3 && drlType == "collect"))
        then
            System.out.println("collect执行成功,匹配结果为:"+$alarms);
        end
    
    新建测试方法
    @Test
    public void collect() {
       session.insert(new People(1, "达","collect"));
       session.insert(new People(0, "秋","collect"));
       session.insert(new People(0, "春","collect"));
       session.insert(new People(1, "夏","collect"));
       session.insert(new People(0, "冬","collect"));
       session.insert(new People(3, "金","collect"));
    
        session.fireAllRules();//执行规则
    }
    
    执行测试,正确打印出匹配的实事,其中 sex=3的“金” 没有匹配到结果中
    collect执行成功,匹配结果为:
    [People(sex=0, name=冬, drlType=collect),
     People(sex=1, name=夏, drlType=collect), 
     People(sex=0, name=春, drlType=collect), 
     People(sex=0, name=秋, drlType=collect), 
     People(sex=1, name=达, drlType=collect)]
    

      当改变参数,入参只留下两个 sex != 3 的数据,则没有任何打印结果

    2.5.3 accumulate 迭代器

      用于遍历数据集对数据项执行自定义或预设动作并返回结果。

    2.5.3.1 accumulate 函数
    • average
    • min
    • max
    • count
    • sum
    • collectList 获取列表
    • collectSet 获取集合
    average样例 新建 accumulate.drl
    package com.ytooo.collt
    dialect "java"
    import com.ytooo.bean.Sensor
    import java.util.List
    
    rule "accumulate"
      when
       $avg : Number() from accumulate(Sensor(temp >= 5 && $temp : temp),average($temp))
      then
        System.out.println("accumulate成功执行,平均温度为:" + $avg);
    end
    
    新建测试方法
     @Test
    public void accumulate() {
        session.insert(new Sensor("达", 8.26));
        session.insert(new Sensor("秋", 7.12));
        session.insert(new Sensor("春", 3.24));
        session.insert(new Sensor("夏", 6.32));
        session.insert(new Sensor("冬", 12.23));
        session.insert(new Sensor("金", 10.8));
    
        session.fireAllRules();//执行规则
    }
    
    执行测试,触发规则并打印平均值
    accumulate成功执行,平均温度为:8.946
    
    2.5.4 自定义 accunmulate
    • init 初始化变量
    • action 每次遍历执行的动作
    • reverse (可选)反转动作,用于优化
    • result 返回的执行结果
    @Test
    public void diyaccumulate() {
        session.insert(new People(1, "达",26,"diyaccumulate"));
        session.insert(new People(0, "秋",18,"diyaccumulate"));
        session.insert(new People(0, "春",38,"diyaccumulate"));
        session.insert(new People(1, "夏",90,"diyaccumulate"));
        session.insert(new People(0, "冬",55,"diyaccumulate"));
        session.insert(new People(3, "金",12,"diyaccumulate"));
    
        session.fireAllRules();//执行规则
    }
    
    rule "diyaccumulate"
        when
            People(drlType == "diyaccumulate")
            $avg: Number() from accumulate(People($age: age,drlType == "diyaccumulate"),
            init(int $total = 0, $count = 0;),
            action($total += $age; $count++;),
            result($total/$count))
    
        then
            System.out.println("Avg: " + $avg);
    end
    
    输出结果
    Avg: 39
    




    教程代码已提交到ytooo-drools,欢迎star

    Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手

    Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解





    更多好玩好看的内容,欢迎到我的博客交流,共同进步        WaterMin

    喜欢听相声的朋友,也可以来我的 YouTube,来听郭老师的相声    秋酿


    展开全文
  • Drools规则引擎教程

    2016-03-29 20:53:32
    Drools规则引擎教程,需在jdk1.6下运行,不缺jar包
  • Drools规则引擎视频教程

    千次阅读 2020-02-16 17:50:15
    经过多半个月的加班加点,终于又完成了一套Drools规则引擎的视频教程。新增了Workbench和KIE Server的内容,而且后续还会持续更新。 相关视频教程内容,可在CSDN学院获得:https://edu.csdn.net/combo/detail/1575 ...

    经过多半个月的加班加点,终于又完成了一套Drools规则引擎的视频教程。新增了Workbench和KIE Server的内容,而且后续还会持续更新。

    相关视频教程内容,可在CSDN学院获得:https://edu.csdn.net/combo/detail/1575

    至此,关于Drools规则引擎的视频教程核心内容已经差不多完成。后续还会围绕实战进行更多内容的扩充。

    展开全文
  • Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手 Drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件 Drools规则引擎 系列教程(四)Drools 主要API & 决策表 教程代码已提交到ytooo...

    Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手

    Drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件

    Drools规则引擎 系列教程(四)Drools 主要API & 决策表

    教程代码已提交到ytooo-drools,欢迎star

    1. RHS动作

      RHS 部分定义了当LHS满足是要进行的操作,规则操作的主要目的是在Drools引擎的工作内存中插入,删除或修改数据。RHS中可以编写代码,可以使用LHS 部分当中定义的绑定变量名以及drl头部定义的全局变量。在RHS当中如果需要条件判断,那么请重新考虑将其放在 LHS 当中,否则就违背了使用规则的初衷。

    1.2. 主要操作

    动作 描述
    set 给属性赋值
    modify 将改变通知drolls引擎
    update 将改变通知drolls引擎
    insert 将新实事插入到drools引擎的工作
    insertLogical insert增强版,需声明撤回事件,或待不在匹配条件后自动撤回
    delete 删除实事

    1.3. Update

      Update用于将数据的更改更新到引擎,并通知引擎重新匹配该事实

    package com.ytooo.updat
    dialect "java"
    import com.ytooo.bean.People
    
    rule 'update1'
        when
           $p : People(drlType == "update" && sex == 0)
        then
            System.out.println("update1执行====" + $p);
            $p.setSex(1);
            update($p)
        end
    rule 'update2'
        when
           $p : People(drlType == "update" && sex == 1)
        then
            System.out.println("update2执行====" + $p);
        end
    
    @Test
    public void update() {
    
        People people = new People();
        people.setName("达");
        people.setSex(0);
        people.setAge(17);
        people.setDrlType("update");
        session.insert(people);//插入
        session.fireAllRules();//执行规则
    }
    

    当规则1执行后,通过update($p)改变对象值,并重新触发规则2

    update1执行====People(sex=0, name=达, age=17, drlType=update)
    update2执行====People(sex=1, name=达, age=17, drlType=update)
    
    modify 用法与 update类似
    rule 'modify'
        when
          $p : People(drlType == "update" && sex == 1)
        then
           System.out.println("update3执行====" + $p);
           modify($p){
              setSex(-1)
           }
        end
    
    update1执行====People(sex=0, name=达, age=17, drlType=update)
    update2执行====People(sex=1, name=达, age=17, drlType=update)
    update3执行====People(sex=1, name=达, age=17, drlType=update)
    
    特别注意,当在then中改变变量属性值,但不使用update语句时,在调用测试方法中,打印people对象时,值已经被改变,只是不出发规则执行

      修改后的测试代码:

    @Test
    public void update() {
    
        People people = new People();
        people.setName("达");
        people.setSex(0);
        people.setAge(17);
        people.setDrlType("update");
        session.insert(people);//插入
        session.fireAllRules();//执行规则
        System.out.println("test执行====" + people.toString());
    }
    

      修改后的规则:

    package com.ytooo.updat
    dialect "java"
    import com.ytooo.bean.People
    
    rule 'update1'
        when
           $p : People(drlType == "update" && sex == 0)
        then
            System.out.println("update1执行====" + $p);
            $p.setSex(1);
    //        update($p)
        end
    rule 'update2'
        when
           $p : People(drlType == "update" && sex == 1)
        then
            System.out.println("update2执行====" + $p);
        end
    rule 'modify'
        when
          $p : People(drlType == "update" && sex == 1)
        then
           System.out.println("update3执行====" + $p);
           modify($p){
             setSex(-1)
           }
        end
    

      执行结果:

    update1执行====People(sex=0, name=达, age=17, drlType=update)
    test执行====People(sex=1, name=达, age=17, drlType=update)
    

    2. drools header详解

    2.1 import引入java方法 以及 function

      导入规则文件需要使用到的外部规则文件或者变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法

    被引入的java方法
    package com.ytooo.utils;
    
    public class DroolsStringUtils {
        public static boolean isEmpty(String param) {
            return param == null || "".equals(param);
        }
    }
    
    在规则文件中使用
    package com.rules.impor
    dialect "java"
    import com.ytooo.bean.People
    import function com.ytooo.utils.DroolsStringUtils.isEmpty
    
    function String hello(String applicantName) {
        return "Hello " + applicantName + "!";
    }
    
    rule "impot"
    
      when
        $p : People(drlType == "impot")
      then
        System.out.println(isEmpty("我"));
        System.out.println(hello("达"));
      end
    
    执行测试方法,函数执行
     @Test
    public void impot() {
        People people = new People();
        people.setDrlType("impot");
        session.insert(people);//插入
        session.fireAllRules();//执行规则
    }
    
    执行结果
    false
    Hello 达!
    

    2.2 Global 全局变量

      Drools规则文件中的全局变量(global variables)是规则文件代码与java代码之间相互交互的桥梁,我们可以利用全局变量让规则文件中的程序使用java代码中的基本变量、缓存信息或接口服务等等。

    2.2.1 基本语法:

    global 类型 变量名

    例如:
    global java.util.List list

    2.2.2 使用全局变量来传递数据样例

       全局变量可以是一个services或者一个对象,来方便drolls与java之间的数据传输

    2.2.2.1 定义全局服务以及全局对象
    package com.ytooo.globa;
    
    import com.ytooo.bean.People;
    import org.springframework.stereotype.Service;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Created by Youdmeng on 2020/1/14 0014.
     */
    @Service
    public class GloableService {
    
        public static List<People> getPeoples() {
            List<People> peoples = new ArrayList<>();
            peoples.add(new People(1, "春", "global"));
            peoples.add(new People(2, "夏", "global"));
            peoples.add(new People(3, "秋", "global"));
            peoples.add(new People(4, "冬", "global"));
            peoples.add(new People(5, "达", "global"));
            return peoples;
        }
    }
    
    package com.ytooo.bean;
    import lombok.Data;
    /**
     * Created by Youdmeng on 2020/1/14 0014.
     */
    @Data
    public class NumCount {
    
        private int count;
    
        public void plus() {
            count = count + 1;
        }
    }
    
    2.2.2.2 在drl脚本中使用全局变量

      全局变量以 global 类型 变量名 的方式在规则中定义,在规则Then语句中使用变量名直接对其进行操作

    package com.ytooo.globa
    dialect "java"
    
    import com.ytooo.bean.People
    import  java.lang.Integer
    
    global com.ytooo.globa.GloableService service
    global java.util.List list
    global com.ytooo.bean.NumCount numCount
    
    rule "global"
        when
            People(drlType == "global")
            $p : People() from service.getPeoples()
        then
            list.add($p);
            numCount.plus();
        end
    
    2.2.2.3 在java代码中声明全局变量,并取值

       在java代码中使用全局变量,首先要使用 session.setGlobal(变量名,变量)的方式声明变量,其中变量名要与规则中引入变量名相同

       若要取值,要使用 session.getGlobal(变量名)的方法,其中变量名要与规则中引入变量名相同

     @Test
    public void global() {
        People people = new People();
        people.setDrlType("global");
        session.insert(people);//插入
        //配置全局变量
        List<People> list = new ArrayList<>();
        NumCount numCount = new NumCount();
        GloableService service = new GloableService();
        session.setGlobal("list", list);
        session.setGlobal("numCount", numCount);
        session.setGlobal("service", service);
        session.fireAllRules();//执行规则
        //取出全局变量值
        System.out.println(session.getGlobal("list").toString());
        System.out.println((session.getGlobal("numCount")).toString());
    }
    
    输出结果
    [People(sex=5, name=达, age=null, drlType=global), People(sex=4, name=冬, age=null, drlType=global), People(sex=3, name=秋, age=null, drlType=global), People(sex=2, name=夏, age=null, drlType=global), People(sex=1, name=春, age=null, drlType=global)]
    NumCount(count=5)
    

    2.3 querys 查询

    avatar
      Query语法提供了一种查询working memory中符合约束条件的FACT对象的简单方法。它仅包含规则文件中的LHS部分,不用指定“when”和“then”部分。Query有一个可选参数集合,每一个参数都有可选的类型。如果没有指定类型,则默认为Object类型。

    2.3.1 定义drl查询语句

       可以定义多个查询参数,在调用查询时传入

    package com.ytooo.quey
    dialect "java"
    
    import com.ytooo.bean.People
    
    query "queryPeople" (String $name,Integer $sex)
        $p : People(name == $name, sex == $sex)
    end
    
    2.3.2 java中进行查询

       使用session.getQueryResults(查询名, 参数, 参数。。。) 来获取QueryResults匹配对象列表

     @Test
    public void query() {
        session.insert(new People(1, "春", "query"));
        session.insert(new People(2, "夏", "query"));
        session.insert(new People(3, "秋", "query"));
        session.insert(new People(4, "冬", "query"));
        session.insert(new People(5, "达", "query"));
        QueryResults results = session.getQueryResults("queryPeople", "达", 5);
        for (QueryResultsRow row : results) {
            People p = (People) row.get("$p");
            System.out.println(p);
        }
    }
    
    2.3.2 查询结果
    People(sex=5, name=达, age=null, drlType=query)
    

    2.4 declare 自定义fact对象

    2.4.1 declare在drl规则文件中定义:
    package com.ytooo.declar
    dialect "java"
    
    declare Love
        feel : String
        continued : String
    end
    rule "love"
    when
        $l : Love()
    then
        System.out.println("自定义事件执行: " + $l);
    end
    
    2.4.2 在api中使用

      通过 kieBase.getFactType(域名,实事名)的方式获取实事对象并实例
      通过 factType.set(实例,属性名,属性值)的方式来赋值变量

    @Test
    public void declare() throws IllegalAccessException, InstantiationException {
    
        FactType factType = kieBase.getFactType("com.ytooo.declar","Love");
        Object obj = factType.newInstance();
        factType.set(obj,"feel","sad");
        factType.set(obj,"continued","永远");
        session.insert(obj);
        session.fireAllRules();
    }
    
    2.4.3 执行结果
    People(sex=5, name=达, age=null, drlType=query)
    




    教程代码已提交到ytooo-drools,欢迎star

    Drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件

    Drools规则引擎 系列教程(四)Drools 主要API & 决策表





    更多好玩好看的内容,欢迎到我的博客交流,共同进步        WaterMin

    喜欢听相声的朋友,也可以来我的 YouTube,来听郭老师的相声    秋酿


    展开全文
  • Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手 Drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件 Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解 ...

    Drools规则引擎 系列教程(一)SpringBoot整合 & 快速集成上手

    Drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件

    Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解

    教程代码已提交到ytooo-drools,欢迎star

    drools 规则引擎配置文件解析




    教程代码已提交到ytooo-drools,欢迎star
    Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解





    更多好玩好看的内容,欢迎到我的博客交流,共同进步        WaterMin

    喜欢听相声的朋友,也可以来我的 YouTube,来听郭老师的相声    秋酿


    展开全文
  • 前言 ...而这个drools规则引擎,可以方便的将业务的整体逻辑移出,更加方便程序的可读性。 准备 第一步,随便创建maven项目 第二步,pom的引入 <dependency> <groupId>org.drools&
  • Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需...
  • Drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件 Drools规则引擎 系列教程(三)Drools规则语法 & RHS动作 & header详解 Drools规则引擎 系列教程(四)Drools 主要API & 决策表 教程代码...
  • Drools 规则引擎视频教程》相关事宜

    万次阅读 多人点赞 2017-08-12 10:38:45
    非常感谢大家能够有时间来看这篇博客,本篇博客主要介绍一下最近本人正在致力于的Drools 7 规则引擎文档和视频教程相关事项。Drools 本身在国内的技术网站上的资料就比较少,最近的视频教程更是几乎没有。本人最近一...
  • Drools7规则引擎入门教程

    万人学习 2017-08-04 18:33:57
    Drools规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。本次课程的主要内容分为以下几个方面: 1.规则引擎、 Drools规则引擎简介 2.Drools规则引擎各类基础知识点讲解,如...
  • Drools 规则引擎视频教程》相关事宜 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/wo541075754/article/details/77110752 非常...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 373
精华内容 149
关键字:

drools规则引擎教程