Drools开源业务规则引擎(一)- 安装与介绍(构建KieBase) ...

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

Drools开源业务规则引擎(一)- 安装与介绍


  
0.何为规则引擎

规则引擎,是业务规则管理系统的一部分,主要思想是将应用步伐中的业务决策部分分离出来,并使用预界说的语义模板编写业务决策(业务规则),由用户或开发者在必要时举行配置、管理。规则引擎通过业务规则管理系统(BRMS,Business Rule Management System)来实现对业务规则的会合管理和动态执行。
规则引擎的主要特点和好处:


  • 灵活性和可配置性:用户通过配置而不是代码编写来界说和管理业务规则。这使得规则可以根据需求举行更加灵活的调解和修改,而无需举行软件开发和发布。
  • 可维护性和可扩展性:业务规则的管理和维护变得更加容易。通过规则引擎,用户可以独立地修改、添加或删除规则,而无需修改应用步伐的源代码。这提高了维护性和扩展性,同时降低了代码维护的风险和成本。
  • 业务与技能的分离:将业务规则从应用步伐中分离出来,使得业务人员可以直接到场规则的界说和管理,而不必要依赖开发团队。这种分离促进了业务和技能之间的协作和沟通,加快了业务需求的落地。
  • 决策智能化:支持规则的动态执行和智能推断。可以根据究竟和规则条件举行推理并做出相应的决策,业务处置惩罚过程更加智能化和自动化,并能够根据具体场景和条件举行个性化决策。
  • 可重复使用和尺度化:规则可以被重复使用,并且以尺度化的方式举行管理和执行。如许,不同的应用步伐和系统可以共享相同的规则库,实现了规则的尺度化和统一的执行。
目前市面上具体的规则引擎产物有:


  • Drools:Drools是一款开源的Java规则引擎,并且提供了强大的规则管理和执行功能。是业界广泛应用的规则引擎,具有丰富的功能和灵活的配置选项。
  • IBM Operational Decision Manager:ODM 是IBM提供的一套规则引擎和决策管理解决方案。具有强大的规则管理和执行能力,并且可以与其他IBM产物和技能举行集成。
  • PegaRULES Decision Management:Pegasystems推出的一款规则引擎产物,提供了全面的决策管理功能,包罗规则的创建、维护、版本控制和执行。
  • Blaze Advisor:FICO(原Fair Isaac Corporation)推出的一款领先的规则引擎产物。具有高性能和可扩展的规则执行引擎,适用于大规模的决策管理和业务规则管理场景。
  • JBoss BRMS:红帽公司(Red Hat)提供的一套开源规则引擎和决策管理系统。基于Drools引擎,并提供了全面的规则管理和执行功能,支持多种商业规则管理需求。
1.Drools介绍

1.1.依赖模块

Drools 是一款开源的业务规则管理系统和规则引擎,由Jboss(现为红帽)开发和维护。Drools完全使用Java语言开发,基于Charles Forgy的RETE算法实现规则的高效执行。它提供了强大的规则管理和执行功能,能够资助用户更好地管理和执行业务规则。
Drools被分解为几个模块,部分在规则开发/编译过程中必要,另一部分在运行时必要。在大多数情况下,项目只必要运行时包含的所有模块大概依赖,这种方式能提供更好的灵活性。所以运行时规则引擎的jar可以压缩到极致,只必要3个jar包(几百KB)。
以下是构成JBoss Drools的重要库的形貌:


  • knowledge-api.jar :提供一组接口和类,有助于清晰地显示什么是用户API,什么是引擎API。
  • knowledge-internal-api.jar :提供了内部接口和工厂。
  • drools-core.jar : 核心引擎,运行时组件。包含RETE算法引擎和LEAPS前向推理算法引擎。如果你正在预编译规则(并通过Package或RuleBase对象举行部署),这是唯一的运行时依赖项。
           预编译规则(pre-compiling rules)指将规则在运行时之前举行编译的过程。通过预编译规则,可以提高规则引擎的执行服从。
  • drools-compiler.jar : 包含编译器/构建器组件,以获取规则源,并构建可执行规则库。这通常是应用步伐的运行时依赖项,但如果你正在预编译规则,则不必依赖。这取决于drools-core。
  • drools-jsr94.jar : 这符合JSR-94的实现,这本质上是drools-compiler组件上的一个层。请留意,由于JSR-94规范的性质,并非所有功能都很容易通过此接口暴露。在某些情况下,直接访问Drools API会更容易,但在某些环境中,JSR-94是强制性的。
  • drools-decisiontables.jar : 这是决策表“编译器”组件,它使用drools-编译器组件。这支持excel和csv输入格式。
上述组件还必要相称多的其他依赖项,其中大多数用于drools-compiler、drools-jsr94或drools-decisiontables模块。
1.2.规则引擎

Drools引擎是Drools中的规则引擎。Drools引擎存储、处置惩罚和评估数据,以执行界说好的业务规则或决策模子。Drools引擎的基本功能是将传入的数据或究竟与规则的条件相匹配,并确定是否以及怎样执行规则。

Drools引擎使用以下基本部件运行:


  • Rules:业务规则或DMN决策。所有规则都必须至少包含触发规则的条件以及规则规定的利用。(如上述案例的规则文件user.drl)
  • Facts:Drools引擎中匹配规则条件的输入数据。(如上述案例中的UserIn对象)
  • Production memory:Drools引擎中存储规则的位置。
  • Working memory:Drools引擎中存储究竟的位置。
  • Agenda:已激活规则的注册和排序位置,为执行规则做准备。
2.Drools安装

2.1.依赖导入

  1.         <dependency>
  2.             <groupId>org.drools</groupId>
  3.             <artifactId>drools-compiler</artifactId>
  4.             <version>7.6.0.Final</version>
  5.         </dependency>
复制代码
2.2.规则的输入和输出范例

输入范例

  1. import lombok.Data;
  2. import java.io.Serializable;
  3. /**
  4. * @Name: UserIn
  5. * @Description: 用户规则的输入对象
  6. * @Author: ahao
  7. * @Date: 2024/6/28 11:43 PM
  8. */
  9. @Data
  10. public class UserIn implements Serializable {
  11.     /**
  12.      * 年龄:[0,100]
  13.      */
  14.     private Integer age;
  15. }
复制代码
输出范例

  1. import lombok.Data;
  2. import java.io.Serializable;
  3. /**
  4. * @Name: UserOut
  5. * @Description: 用户规则的输出对象
  6. * @Author: ahao
  7. * @Date: 2024/6/28 11:46 PM
  8. */
  9. @Data
  10. public class UserOut implements Serializable {
  11.     /**
  12.      * 年龄阶段::0-6岁为婴幼儿;7-12岁为少儿;13-17岁为青少年;18-45岁为青壮年;46-69岁为中年;69岁以上为老年
  13.      */
  14.     private String ageStages;
  15. }
复制代码
2.3.创建规则文件

位置:classpath:drools/drl/user.drl
  1. package drools.drl
  2. // 导入输入类型
  3. import com.ahao.project.input.UserIn;
  4. // 以全局变量的形式,定义输出类型
  5. global com.ahao.project.output.UserOut output;
  6. //0-6岁为婴幼儿;
  7. rule "age_0_6"
  8. activation-group "age_stage"
  9. enabled true
  10. when
  11.     input:com.ahao.project.input.UserIn(age >= 0 && age <= 6);
  12. then
  13.     output.setAgeStages("婴幼儿");
  14. end
  15. // 7-12岁为少儿;
  16. rule "age_7_12"
  17. activation-group "age_stage"
  18. enabled true
  19. when
  20.     input:com.ahao.project.input.UserIn(age >= 7 && age <= 12);
  21. then
  22.     output.setAgeStages("少儿");
  23. end
  24. // 13-17岁为青少年;
  25. rule "age_13_17"
  26. activation-group "age_stage"
  27. enabled true
  28. when
  29.     input:com.ahao.project.input.UserIn(age >= 13 && age <= 17);
  30. then
  31.     output.setAgeStages("青少年");
  32. end
  33. // 18-45岁为青壮年;
  34. rule "age_18_45"
  35. activation-group "age_stage"
  36. enabled true
  37. when
  38.     input:com.ahao.project.input.UserIn(age >= 18 && age <= 45);
  39. then
  40.     output.setAgeStages("青壮年");
  41. end
  42. // 46-69岁为中年;69岁以上为老年
  43. rule "age_46_69"
  44. activation-group "age_stage"
  45. enabled true
  46. when
  47.     input:com.ahao.project.input.UserIn(age >= 46 && age <= 69);
  48. then
  49.     output.setAgeStages("中年");
  50. end
  51. // 69岁以上为老年
  52. rule "age_69_999"
  53. activation-group "age_stage"
  54. enabled true
  55. when
  56.     input:com.ahao.project.input.UserIn(age > 69);
  57. then
  58.     output.setAgeStages("老年");
  59. end
复制代码
2.4.构建可执行规则库

  1.     @Test
  2.     public void userDrl() {
  3.               // 获取规则文件
  4.         String drl = "";
  5.         try {
  6.             File file = ResourceUtils.getFile("classpath:drools/drl/user.drl");
  7.             FileReader fileReader = new FileReader(file);
  8.             BufferedReader reader = new BufferedReader(fileReader);
  9.             String s;
  10.             while ((s = reader.readLine()) != null) {
  11.                 drl += s + "\n";
  12.             }
  13.         } catch (FileNotFoundException e) {
  14.             throw new RuntimeException(e);
  15.         } catch (IOException e) {
  16.             throw new RuntimeException(e);
  17.         }
  18.         // 利用KieHelper工具类可以不通过kmodule.xml就可以实现规则
  19.         KieHelper kieHelper = new KieHelper();
  20.         // return new RuleBaseConfiguration();
  21.         // RuleBaseConfiguration对象,可用于在决策引擎中配置异常处理程序设置、多线程执行和顺序模式。
  22.         KieBaseConfiguration kieBaseConfiguration = kieHelper.ks.newKieBaseConfiguration();
  23.         //  默认处理异常的类
  24.         // kieBaseConfiguration.setOption(ConsequenceExceptionHandlerOption.get(DefaultConsequenceExceptionHandler.class));
  25.         // 启用多线程: 默认不开启
  26.         // kieBaseConfiguration.setOption(MultithreadEvaluationOption.NO);
  27.         // 启用顺序模式: 默认不开启
  28.         // Drools按照顺序执行规则一次,不会因为工作内存中的改变而再次执行规则。
  29.         // 这就意味着Drools忽略了规则中的insert,modify和update语句,以单个序列执行规则。
  30.         // 这个模式适合在无状态会话中使用。会让规则执行的更快
  31.         kieBaseConfiguration.setOption(SequentialOption.YES);
  32.         // ResourceType.DRL: 表示接受的规则文件类型
  33.         kieHelper.addContent(drl, ResourceType.DRL);
  34.         // 效验规则
  35.         Results verify = kieHelper.verify();
  36.         // 获取错误级别的编译日志
  37.         if (verify.hasMessages( Message.Level.ERROR )) {
  38.             log.error("规则编译失败:{}", messages);
  39.         } else {
  40.             KieBase kieBase = kieHelper.build(kieBaseConfiguration);
  41.             // 创建无状态的会话
  42.             StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();
  43.             // 创建规则输出对象
  44.             UserOut output = new UserOut();
  45.             statelessKieSession.setGlobal("output", output);
  46.             // 创建规则输入对象
  47.             UserIn input = new UserIn();
  48.             input.setAge(35);
  49.             // 执行规则
  50.             statelessKieSession.execute(input);
  51.             log.info("执行规则完毕,年龄:{},结果:{}",input.getAge(),output.getAgeStages());
  52.         }
  53.     }
复制代码
2.5.执行结果:


3.Drools组件说明

3.1. KieBase

Drools中的知识库,它包含了运行规则所必要的所有知识元素。知识元素包罗规则(Rule)、究竟(Fact)、函数(Function)、配置(KieBaseConfiguration)等。KieBase 是Drools中规则引擎的核心部分,它负责管理和执行规则。KieBase 是线程安全的,可以在多个 KieSession 中共享。
3.2. KieSession

Drools规则引擎中与应用步伐交互的接口,是一个运行时的状态容器,包含了 Work Memory、Pattern Matcher , Conflict Resolver 和 Executor 等组件。它用于加载和激活规则,插入究竟,并执行规则的匹配和执行过程。KieSession 可以通过 KieBase 创建,并能够举行查询和获取执行结果等利用。
3.3. KieModule

Drools规则引擎中对规则集合举行打包和部署的单位。包含了多个KieBase和KieSession的配置信息的容器,可以是一个jar文件大概一个文件夹。KieModule可以从本地大概远程的Maven仓库中加载,实现规则的动态更新和灵活部署。
3.4. KieFileSystem

Drools规则引擎中用于动态加载和管理规则资源文件的组件。一个虚拟的文件系统,用来存储规则文件和其他资源文件。它可以添加、修改和删除规则文件,并可以与KieServices和KieBuilder等组件一起使用,实现规则的灵活维护和更新。
3.5. KieContainer

管理KieModule的容器,可以从本地大概远程的Maven仓库中加载KieModule,并且可以动态地更新KieModule。
4.KieBaseConfiguration

KieBaseConfiguration是Drools中用于配置KieBase(规则知识库)的配置类。它提供了一系列配置选项,可以对KieBase举行个性化的设置和定制。
4.1. SequentialOption

设置规则条件的执行顺序。


  • YES:规则引擎将按照规则界说的顺序依次评估规则条件。
  • NO:表示规则条件是并行执行的。
   如果设置为YES,将仅适用于无状态会话StatelessKieSession。
  4.2.EqualityBehaviorOption

用于界说规则中对象之间的相等性比较行为。


  • EQUALITY:使用Java中的equals方法举行对象的相等性比较。
  • IDENTITY:使用Java中的==运算符举行对象的相等性比较(内存所在)。
4.3.EventProcessingOption

变乱处置惩罚模式界说了对变乱流的管理和处置惩罚方式。


  • CLOUD:云模式是一种高效的变乱处置惩罚模式,适用于大规模变乱流。在云模式下,Drools将变乱发送到内存队列中,并使用多个工作线程并行地处置惩罚变乱。
  • STREAM:流模式是一种及时变乱处置惩罚模式,适用于连续产生变乱的应用场景。在流模式下,Drools使用流式架构处置惩罚变乱,可以在变乱到达时立即举行处置惩罚。
4.4.DeclarativeAgendaOption

声明性议程模式。


  • ENABLED:答应使用规则来控制哪些其他规则可以触发以及何时触发。这将比简单使用明显性增长更多的开销,但优点是它是声明性的,因此更具可读性和可维护性。
  • DISABLED:默认情况下,此功能处于关闭状态。
4.5.ConstraintJittingThresholdOption

用于界说规则中约束的即时编译(Just-In-Time Compilation,JIT)阈值。


  • -1:禁用JIT编译,所有约束都将以解释执行方式举行。
4.6.MaxThreadsOption

限定规则引擎在执行期间使用的最大线程数。
4.7.MBeansOption

MBeans是一种Java平台管理扩展(Java Management Extensions,JMX)的尺度,用于管理和监视应用步伐的状态。Drools引擎提供了对MBeans的支持,可以通过MBeans来监控和管理规则引擎的各个方面,如规则集、会话、统计信息等。


  • ENABLED:启用MBeans支持。答应创建和注册与Drools引擎相关的MBeans,以便可以通过JMX接口监控和管理规则引擎。
  • DISABLED:禁用MBeans支持。克制创建和注册任何与Drools引擎相关的MBeans。
4.8. MultithreadEvaluationOption

用于启用或禁用规则评估的多线程执行。


  • ENABLED:启用多线程评估。
  • DISABLED:禁用多线程评估。
4.9. SessionCacheOption

用于控制会话(Session)的缓存行为。此选项仅在使用phreak规则引擎(默认)时有效。


  • NONE:禁用会话缓存。每次创建会话都会及时从规则库构建新的会话对象。
  • SYNC:同步会话缓存。会话将被缓存并与多个线程共享同一个实例。会话的创建和使用是线程安全的。
  • ASYNC:异步会话缓存。会话将被缓存并与多个线程共享同一个实例。会话的创建和使用不是线程安全的,必要开发人员自行确保线程安全。
4.10. ClassLoaderCacheOption

用于控制类加载器的缓存行为。


  • ENABLED :启用类加载器缓存,此为默认选项。Drools会缓存外部父类加载器中的类解析结果,以提高编译性能。
  • DISABLED:禁用类加载器缓存。
4.11. PermGenThresholdOption

用于设置PermGen阈值的类。


  • 在旧版本的Java中,PermGen区域有限,不会自动调解大小,如果步伐动态加载大量类或反复加载类,大概会导致PermGen区域溢出。为了制止这种情况,可以使用PermGenThresholdOption来设置PermGen的阈值。但是自Java 8开始,PermGen被Metaspace所取代。因此,在Java 8及更高版本中,PermGenThresholdOption不再适用。
4.12. CompositeKeyDepthOption

用于设置复合键(Composite Key)的深度。复合键是由多个属性构成的唯一标识符。当使用复合键来界说规则或查询时,大概必要设置复合键的深度,以便在运行时正确匹配和比较复合键。
4.13.RemoveIdentitiesOption

设置是否移除规则的标识符。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表