首页 > 其他分享 >Drools规则引擎

Drools规则引擎

时间:2023-11-27 20:55:38浏览次数:26  
标签:Drools return spring rule 引擎 LHS 规则 ###

what:是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策

  基于 rete 算法的规则引擎  

  rete 算法是实现产生式系统中正向推理的高效模式匹配算法,通过形成一个 rete 网络进行模式匹配,利用基于规则的系统的时间冗余性和结构相似性特征 ,提高系统模式匹

  配效率。像 ILog、Jess、JBoss Rules 等都是基于 RETE 算法的规则引擎。其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果。Rete 算法可以

  被分为两个部分:规则编译和规则执行 。当 Rete 算法进行事实的断言时,包含三个阶段:匹配、选择和执行,称做 match-select-act cycle

  

drools规则引擎由以下几部分构成:
  Rules(规则库)
  Facts  (工作对象)
  Production memory  (生产内存,操作rules中的规则)
  Working memory: (工作内存)
  Agenda  (议程,用于存放通过匹配器进行模式匹配后被激活的规则)

  Pattern Matcher(适配器)    将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。

 

How

  规则文件构成

    package 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用
    import 用于导入类或者静态方法
    global 全局变量
    function 自定义函数
    query 查询
    rule end 规则体

  规则体语法结构  单行注释用"//"进行标记,多行注释以"/"开始,以" /"结束

    rule "ruleName"      ### rule:关键字,表示规则开始,参数为规则的唯一名称
      attributes    ### attributes:规则属性,是rule与when之间的参数,为可选项。
      when       ###  when:关键字,后面跟规则的条件部分。  
        LHS    ###  LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。 (左手边)

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

        RHS    ###  RHS(Right Hand Side):是规则的后果或行动部分的通用名称。 (右手边)
      end       ###  end:关键字,表示一个规则结束。

    ####    LHS部分还可以定义多个pattern,多个pattern之间可以使用and或者or进行连接,也可以不写,默认连接为and。

    ###  比较操作符   > >= == != < <=  contains | not contains (属性里是否包含某值)  memberOf | not memberOf(属性是否属于集合内)  matches | not matches(正则)

    例如:

    rule "add100"
      no-loop true
      lock-on-active true
      salience 1
    when
      $order : Order(price > 100 && price <= 500)    ###  $order 绑定变量名:Object(Field约束)  可以省略,通常绑定变量名的命名一般建议以$开始
    then
      $order.setScore(100);
      update($s);
    end

    //通过规则过滤器实现只执行指定规则
    kieSession.fireAllRules(new kieSession.fireAllRules(new
                        RuleNameEqualsAgendaFilter("rule_filter_1"));

    规则属性  

      salience 指定规则执行优先级   值越大越优先

      dialect 指定规则使用的语言类型,取值为java和mvel
      enabled 指定规则是否启用
      date-effective 指定规则生效时间
      date-expires 指定规则失效时间
      activation-group 激活分组,具有相同分组名称的规则只能有一个规则触发
      agenda-group 议程分组,只有获取焦点的组中的规则才有可能触发  .getAgendaGroup()
      timer 定时器,指定规则触发的时间
      auto-focus 自动获取焦点,一般结合agenda-group一起使用
      no-loop 防止死循环,防止自己更新规则再次触发
      lock-on-active no-loop增强版本。可防止别人更新规则再次出发

      global 全局变量    query查询   function函数    

      条件-LHS加强   条件元素not    条件元素exists   规则继承extend   

      结果-RHS    insert方法    update方法    modify方法    retract/delete方法

      RHS加强    halt 立即终止后面所有规则的执行    getRule  返回规则对象   

  java的springboot工程引入:jar包

  <dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-spring</artifactId>
    <version>${drools.version}</version>
    <exclusions>     ##需要排除spring框架的干扰依赖
      <exclusion>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
      </exclusion>
      <exclusion>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
      </exclusion>
      <exclusion>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
      </exclusion>
      <exclusion>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

 编写配置类

 @Configuratio  

 public class DroolsAutoConfiguration   

  private static final String RULES_PATH = "rules/";      ##drl规则文件 resource路径下的路径

  private KieServices getKieServices() {
    return KieServices.Factory.get();
  }
  @Bean
  @ConditionalOnMissingBean(KieFileSystem.class)
  public KieFileSystem kieFileSystem() throws IOException {
    KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
    for (Resource file : getRuleFiles()) {
      kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH +
      file.getFilename(), "UTF-8"));
    }
    return kieFileSystem;
    }
    private Resource[] getRuleFiles() throws IOException {
      ResourcePatternResolver resourcePatternResolver = new
                            PathMatchingResourcePatternResolver();
      return resourcePatternResolver.getResources("classpath*:" + RULES_PATH +
                            "**/*.*");
    }
    @Bean
    @ConditionalOnMissingBean(KieContainer.class)
    public KieContainer kieContainer() throws IOException {
      final KieRepository kieRepository = getKieServices().getRepository();
      kieRepository.addKieModule(() -> kieRepository.getDefaultReleaseId());
      KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
      kieBuilder.buildAll();
      KieContainer kieContainer =
            getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
      return kieContainer;
    }
    @Bean
    @ConditionalOnMissingBean(KieBase.class)
    public KieBase kieBase() throws IOException {
      return kieContainer().getKieBase();
    }
  }

 

 

  编写规则引擎文件.drl

    

    规则文件编码规范
    在进行drl类型的规则文件编写时尽量遵循如下规范:
    所有的规则文件(.drl)应统一放在一个规定的文件夹中,如:/rules文件夹
    书写的每个规则应尽量加上注释。注释要清晰明了,言简意赅
    同一类型的对象尽量放在一个规则文件中,如所有Student类型的对象尽量放在一个规则文件中
    规则结果部分(RHS)尽量不要有条件语句,如if(...),尽量不要有复杂的逻辑和深层次的嵌套语句
    每个规则最好都加上salience属性,明确执行顺序
    Drools默认dialect为"Java",尽量避免使用dialect "mvel"

  

  WorkBench

    WorkBench是KIE组件中的元素,也称为KIE-WB,是Drools-WB与JBPM-WB的结合体。它是一个可视化的规则编辑器。WorkBench其实就是一个war包。

 

  

 

标签:Drools,return,spring,rule,引擎,LHS,规则,###
From: https://www.cnblogs.com/fzyuni/p/17860428.html

相关文章

  • 位运算的基本规则
    在串行通信的过程中,常涉及数据帧的解码与位运算,这里将集中讲解位运算的理解————位运算是计算机科学中的一种基本运算,它主要是对二进制位进行操作。参考链接:https://blog.csdn.net/qq_39151563/article/details/108305105,内容大部分都是这篇文章中的,下面给出一些记录与理解。......
  • JVS-rules规则引擎导出与导入,确保业务连续性的关键
    在复杂的系统环境中,规则和配置的迁移、备份及共享成为了确保业务连续性和一致性的关键过程。不同的环境可能需要相同的规则和配置数据,或者我们可能需要备份这些数据以防万一。JVS规则引擎提供了规则的导出与导入功能,使用户能够在多个环境间轻松转移配置数据。每一条配置数据都有其......
  • 微信小游戏开发怎么选游戏引擎
    微信小游戏现在非常的火,当我们下定决心做微信小游戏开发的时候,面临我们的第一个问题是怎么选一个H5的游戏引擎,那么今天本小编就来给大家分析一下目前能开发各大平台H5小游戏的游戏引擎和它们的优缺点。入选原则:(1)能一次开发,同时发布到多个游戏平台的游戏引擎;(android,IOS,......
  • Flask 使用Jinja2模板引擎
    Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发,Jinja2为Flask提供了强大的模板支持,后来也成为其他项目的首选。在本文中,我们将深入探讨Jinja2的特性、语法以及如何在Flask应用中使用......
  • 设计规则:模块化的力量
    这是一本比较冷门的书《设计规则:模块化的力量》,虽然豆瓣上只有58个评价,但是确实能学到很多东西。这本书对我非常深远。不是是投资,创业,还是其他领域,模块化思想都能帮上你。这本书告诉我们生万物的规则。书籍电子版PDF(建议及时保存,避免被和谐):https://pan.quark.cn/s/aa40d59295df......
  • 整合驰骋工作流引擎的三种模式以及的优缺点总结
    什么是系统集成?1.当您需要把ccbpm的系统与您的系统或开发架构要一起工作的时候,我们就称为集成.2.集成步骤:功能应用方面的集成与组织结构的集成.3.组织结构集成是第一步,ccbpm有自己独立组织结构,可以独立运行,当与您的应用一起工作时才需要集成。组织结构集成.1.组织结构集成分......
  • 拖拉拽流程设计引擎、简化企业应用开发!
        随着数字化转型的推进,企业对于高效、快捷的应用开发方式的需求也越来越迫切。低代码开发平台作为一种新兴的应用开发工具,已经逐渐成为企业的首选。其中,拖拉拽设计流程是低代码开发平台的一项重要功能,它能够极大地简化流程设计的过程,使得企业能够更加便捷地构建符合自身......
  • 工作流引擎的主要表结构及其作用如下,下面以驰骋工作流引擎为例来说明。
     1.WF_GenerWorkFlow:该表主要用于存储流程引擎级别的数据,发起人,发起日期,workid,流程状态,流程标题,运行到的节点。2.WF_GenerWorkerList::这个表主要用于保存工作人员数据,执行人、执行节点、工作ID,是否读取,是否通过IsPass,.3.NDxxRpt*:业务数据表,表单采集的业务数据。。4.Port_*......
  • 从UE虚幻引擎到播放器页面的通信
    在前面:https://www.cnblogs.com/makalochen/p/17803468.html#新建游戏模式我们已经实现了,从前端到UE的通信,那能不能UE主动给前端发送消息呢?就比如我在播放的像素流中点击了某个物体给所有页面发个消息,说你已经点击了某个物体答案是可以的,参考官网https://docs.unrealeng......
  • Cocos Creator 如何使用物理引擎
    1:开启物理引擎的3个步骤和一个坑:(1)开启引擎:cc.director.getPhysicsManager().enabled=true(2)配置重力:cc.director.getPhysicsManager().gravity=this.gravity(3)通过开关来控制是否开启调试模式: 开启物理引擎的脚本代码,一定要写到onLoad函数里面,否则无法开启......