尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
规则引擎Drools实战
概述规则引擎起源于基于规则的专家系统而基于规则的专家系统又是专家系统的其中一个分支。专家系统属于人工智能的范畴它模仿人类的推理方式使用试探性的方法进行推理并使用人类能理解的术语解释和证明它的推理结论。利用它就可以在应用系统中分离商业决策者的商业决策逻辑和应用开发者的技术决策并把这些商业决策放在中心数据库或其他统一的地方让它们能在运行时可以动态地管理和修改从而为企业保持灵活性和竞争力提供有效的技术支持。在需求里面往往把约束完整性校验分支流等都可以算到业务规则里面。在规则引擎里面谈的业务规则重点是谈当满足什么样的条件的时候需要执行什么样的操作。因此一个完整的业务规则包括条件和触发操作两部分内容。而引擎是事物内部的重要的运行机制规则引擎即重点是解决规则如何描述如何执行如何监控等一系列问题。规则引擎由推理引擎发展而来是一种嵌入在应用程序中的组件实现将业务决策从应用程序代码中分离出来并使用预定义的语义模块编写业务决策。接受数据输入解释业务规则并根据业务规则做出业务决策。优点声明式编程规则可以很容易地解决困难的问题并得到解决方案的验证。与代码不同规则以较不复杂的语言编写业务分析师可以轻松阅读和验证一套规则逻辑和数据分离数据位于域对象中业务逻辑位于规则中速度和可扩展性写入Drools的Rete OO算法已经是一个成熟的算法。如果频繁更改请求可以添加新规则而无需修改现有规则知识集中化通过使用规则您创建一个可执行的知识库知识库。理想情况下规则是可读的它们也可以用作文档Rete算法最初是由卡内基梅隆大学的Charles L.Forgy博士在1974年发表的论文中所阐述的算法该算法提供专家系统的一个高效实现。自Rete算法提出以后它就被用到一些大型的规则系统中像ILog、Jess、JBoss Rules等都是基于RETE算法的规则引擎。Rete在拉丁语中译为net即网络。Rete匹配算法是一种进行大量模式集合和大量对象集合间比较的高效方法通过网络筛选的方法找出所有匹配各个模式的对象和规则。其核心思想是将分离的匹配项根据内容动态构造匹配树以达到显著降低计算量的效果。Rete算法可以被分为两个部分规则编译和规则执行。当Rete算法进行事实的断言时包含三个阶段匹配、选择和执行称做match-select-act cycle。rate算法参考开源规则流引擎实践Java开源的规则引擎有Drools、Easy Rules、Mandarax、IBM ILOG。Drools官网易于访问企业策略、易于调整及易于管理的开源GitHub6.3K Star2.6K Fork业务规则引擎符合业内标准速度快、效率高。用Java语言编写使用Rete算法对所编写的规则求值。允许使用声明方式表达业务逻辑。可使用非XML的本地语言编写规则从而便于学习和理解。还可将Java代码直接嵌入到规则文件中业务分析师人员或审核人员可以利用它轻松查看业务规则从而检验是否已编码的规则执行所需的业务规则。优势易用、执行速度快、兼容Java Rule Engine API即JSR 94。概念事实Fact对象之间及对象属性之间的关系规则Rule是由条件和结论构成的推理语句一般表示为if…Then。一个规则的if部分称为LHSthen部分称为RHS。模式Module指IF语句的条件。IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。依赖dependencygroupIdorg.drools/groupIdartifactIddrools-core/artifactId/dependencyDrools通过事实、规则和模式相互组合来完成工作。有专门的规则语法drl就是专门描述活动的规则是如何执行的。DSLDomain Specific Language.drl、.dslr或.xls文件规则语言一个规则通常包括三个部分属性部分 attribute、 条件部分 LHS和结果部分 RHS规则流宏对象实战用户支付金额和对应送多少积分的规则如下100元含以下不加分 100元-500元含加100分 500元不含以上加500分写出的规则文件point-rulesKS.drlpackage rulesimportcom.johnny.drools.entity.Order rulezerono-looptruelock-on-activetruesalience1when$s:Order(amout100)then$s.setScore(0);update($s);end ruleadd100no-looptruelock-on-activetruesalience1when$s:Order(amout100amout500)then$s.setScore(100);update($s);end ruleadd500no-looptruelock-on-activetruesalience1when$s:Order(amout500)then$s.setScore(500);update($s);end说明package与Java语言类似drl的头部需要有package和import的声明package不必和物理路径一致import导出Java Bean的完整路径也可以将Java静态方法导入调用rule规则名称需保持唯一性可以无限次执行no-loop定义当前的规则是否不允许多次循环执行默认是false也就是当前的规则只要满足条件可以无限次执行lock-on-active设置为true可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行salience用来设置规则执行的优先级值是一个数字可以是负数数字越大执行优先级越高。默认为0。如果不设置规则的salience 属性那么执行顺序是随机的when条件语句当到达什么条件时then根据条件的结果来执行什么动作end规则结束放置在resources/META-INF/kmodule.xml目录下的配置文件告诉代码规则文件drl在哪里kmodulekbasenamepoint-rulesKBpackagesrulesksessionnamepoint-rulesKS//kbase/kmodule解释Kmodule可以包含一个到多个 kbase分别对应 drl 的规则文件Kbase需要一个唯一的name可以取任意字符串packages为drl文件所在resource目录下的路径。注意区分drl文件中的package与此处的package不一定相同。多个包用逗号分隔。默认情况下会扫描 resources目录下所有(包含子目录)规则文件kbase的default属性标示当前KieBase是不是默认的如果是默认的则不用名称就可以查找到该 KieBase但每个 module 最多只能有一个默认 KieBasekbase可以有一个或多个ksessionksession 的name属性必须设置且必须唯一publicstaticvoidmain(String[]args)throwsException{KieServicesksKieServices.Factory.get();KieContainerkcks.getKieClasspathContainer();execute(kc);}privatestaticvoidexecute(KieContainerkc)throwsException{KieSessionksessionkc.newKieSession(point-rulesKS);ksession.insert(null);ksession.fireAllRules();ksession.dispose();}首先请求获取KieServices通过KieServices获取KieContainerKieContainer加载规则文件并获取KieSessionKieSession来执行规则引擎KieSession是一个轻量级组件每次执行完销毁。KieContainer是重量级组建需考虑复用。概念Fact对象API规则编译、规则收集和规则执行KnowledgeBuilderKnowledgeBaseStatefulKnowledgeSessionStatelessKnowledgeSessionKnowledgeBaseConfiguration规则属性不完全列表属性名称默认值解释activation-group激活分组agenda-group议程分组auto-focusfalsedate-effective生效时间date-expires失效时间dialectJava或Mvelduration定时器enabledtrue设置为false则规则体将不被激活lock-on-activefalse设置为true当前只会被触发一次。解决死循环no-loopfalse设置为true避免当前规则then部分被修改后的事实对象再次被激活从而防止死循环的发生即执行下面的规则ruleflow-group规则、流程、分组即规则流salience0规则体被执行的顺序。不设置salience属性规则体的执行顺序为由上到下。salience可以是负数值越大执行顺序越高timer关键词有硬关键词和软关键词之分。硬关键字主要包括true、false、null规则文件不能使用。软关键词在规则文件里可以使用但是得以驼峰命名格式作为字段名的部分如someRule。包括lock-on-active、date-effective、date-expires、no-loop、auto-focus、activation-group、agenda-group、ruleflow-group、entry-point、duration、package、import、dialec、salience、enabled、attributes、rule、extend、template、query、declare、function、global、eval、not、in、or、and、exists、forall、action、reverse、result、end、init等。参考
RELATED

相关推荐

Python——第三方扩展库 之 使用 Pyinstaller 模块实现【Python代码打包成系统可执行文件】

Python——第三方扩展库 之 使用 Pyinstaller 模块实现【Python代码打包成系统可执行文件】

Pyinstaller 模块Pyinstaller 模块的基本使用常见问题以及解决方案问题1:无法将“pyinstaller”项识别为...1.查看是否下载了pyinstaller包2.查看已下载的第三方扩展库所在路径,找到一个名称为Scripts的文件夹3.复制Scripts路径,并添加环境变…

📅 2026/11/9 23:57:58
单片机洗衣机控制器毕业设计:硬件软件全流程拆解

单片机洗衣机控制器毕业设计:硬件软件全流程拆解

简介:这是基于单片机的洗衣机控制器设计毕业设计文档,面向电子信息、自动化等专业本科生及嵌入式入门者,完整覆盖课题背景、硬件设计、芯片选型、软件流程与调试方法。全篇为doc格式,共1个文件,压缩包大小约567KB&…

📅 2026/10/28 23:28:56
javacv音视频截图,音频抽取汇总

javacv音视频截图,音频抽取汇总

概述:java 使用 javacv 视频截帧, 跳到指定帧截图, 从视频中抽取音频, 音频分割为多段1 依赖:<dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.7</version> </dependency><depen…

📅 2026/11/9 6:11:30
MORE NEWS

更多资讯

📰

初次报考电工作业如何挂指示牌 内部消息透露报名门槛真相

初次报考电工作业如何挂指示牌 内部消息透露报名门槛真相 学历不高怕报不上名?别急,电工作业如何挂指示牌这个关键词背后,藏着不少“内部消息”,特别是针对初次报考的你。很多人以为学历不够就玩不了电工,但现实是,只要符合条件,学历不是硬伤,关键是…

📰

澳洲如何考电工证?郑州报考避坑指南:3个步骤教你一次通关

澳洲如何考电工证?郑州报考避坑指南:3个步骤教你一次通关 怕考不过白交培训费?别再盲目选培训机构了,很多郑州电工想在澳洲发展,却因证书门槛高、流程复杂、机构鱼龙混杂而耽误时间。其实考电工证不是难事,关键在于选对方式、掌握流程、规划好时间。这…

📰

青州高压电工证考试多少钱?工地太忙根本没时间复习考试?

青州高压电工证考试多少钱?工地太忙根本没时间复习考试? 工地太忙根本没时间复习考试,特别是像你这种在郑州金水区从事水利工程的电工,一天到晚都在赶工期、盯现场,哪还有时间准备高压电工证的考试?别急,我来告诉你青州高压电工证考试到底是怎么回事,…

📰

高压电工作业监护人数2人,真实经历告诉你怎么避开报名陷阱

高压电工作业监护人数2人,真实经历告诉你怎么避开报名陷阱 你是不是也遇到过这种情况?想报考高压电工作业证,却不知道去哪报名,怕被中介骗钱,结果越打听越迷糊?我有个朋友,濮阳人,原本在建筑工地干电工,后来想转行做电力安装,结果一不小心就被中介…

📰

电工证科一考试技巧2026河南最新政策怎么考更稳妥

电工证科一考试技巧2026河南最新政策怎么考更稳妥 你是不是还在为不知道去哪报名怕被中介坑发愁?2026年河南最新政策已经落地,对于准备报考电工证的你来说,掌握 电工证科一考试技巧…

📰

电工证哪里靠谱怎么考?上岗必备的证书你真的了解吗

电工证哪里靠谱怎么考?上岗必备的证书你真的了解吗 证书过期了不知道怎么复审延期,这几乎是每个特种作业人员都经历过的问题。特别是电工证,作为上岗必备的证件,如果过期不处理,不仅影响工作安排,还可能面临法律风险。很多人误以为电工证是“一劳永逸”…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬