分享好友 最新动态首页 最新动态分类 切换频道
java 工厂策略规则引擎 java开源规则引擎
2024-12-26 23:00


java 工厂策略规则引擎 java开源规则引擎


文章目录

  • 1.Drools规则引擎简介
  • 2.Drools API开发步骤
  • 3.SpringBoot整合Drools案例
  • 4.Drools基础语法
  • 5.Drools条件语法部分
  • 6.Drools结果操作部分
  • 7.Drools内置属性部分
  • 8.Drools高级语法部分


1.Drools规则引擎简介

(1)什么是规则引擎

全称为业务规则管理系统,英⽂名为BRMS(即 Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。 需要注意的是规则引擎并不是一个具体的技术框架,而是指的⼀类系统,即业务规则管理系统。

目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等,使用最为广泛并且开源的是Drools。

规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出的平台。

(2)规则引擎主要的应用场景

  • 风险控制系统----风险贷款、风险评估
  • 反欺诈项目----银行贷款、征信验证
  • 决策平台系统----财务计算
  • 促销平台系统----满减、打折、加价购

(3)Drools介绍

Drools是⼀款由JBoss组织提供的基于Java语⾔开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在⽂件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、不⽤重启服务器就可以在线上环境立即生效。

Drools官网地址:https://drools.org/

drools源码下载地址:https://github.com/kiegroup/drools

(4)使用规则引擎能解决什么问题

  • 硬编码实现业务规则难以维护
  • 硬编码实现业务规则难以应对变化
  • 业务规则发⽣变化需要修改代码,重启服务后才能生效

(5)使用规则引擎的优势

  • 业务规则与系统代码分离,实现业务规则的集中管理
  • 在不重启服务的情况下可随时对业务规则进行扩展和维护
  • 可以动态修改业务规则,从⽽快速响应需求变更
  • 规则引擎是相对独立的,只关心业务规则,使得业务分析⼈员也可以参与编辑、维护系统的业务规则
  • 减少了硬编码业务规则的成本和风险
  • 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单
2.Drools API开发步骤

我们在操作Drools时经常使用的API以及它们之间的关系如下图:

Kie全称为Knowledge Is Everything,即“知识就是一切”的缩写,是Jboss一系列项目的总称。

规则引擎构成

drools规则引擎由以下三部分组成:

  • Working Memory(工作内存)
  • Rule Base(规则库)
  • Inference Engine(推理引擎)

其中Inference Engine(推理引擎)又包括:

● Pattern Matcher(匹配器) 具体匹配哪⼀个规则,由这个完成

● Agenda(议程)

● Execution Engine(执行引擎)

相关概念说明

  • **Working Memory:**工作内存,drools规则引擎会从Working Memory中获取数据和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要我们的数据插入到Working Memory中即可。
  • **Fact:**事实,是指在drools规则应用中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象。
  • **Rule Base:**规则库,我们在规则文件中定义的规则都会被加载到规则库中。
  • **Pattern Matcher:**匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。
  • **Agenda:**议程,用于存放通过匹配器进行模式匹配后被激活的规则。
  • **Execution Engine:**执行引擎,执行Agenda中被激活的规则。

规则引擎执行过程

3.SpringBoot整合Drools案例

(1)案例背景

某电商平台的促销活动,活动规则是根据⽤户购买订单的⾦额给⽤户送相应的积分,购买的越多送的积分越多

用户购买的金额和对应送多少积分的规则如下:

按照常理,作为一个工作一两年的开发工程师来说,这不是分分钟搞定的事情,直接上午开发,下午提测。

但是,假如说现在产品经理不想100元以下不送积分了,想要200元以下不送金额了,是不是又要重新改代码了。所以Drools帮我们解决在不改动原有代码的情况下修改规则的信息。

(2)创建Maven项目,加入SpringBoot依赖

(3)resources下创建yml配置文件

(4)创建SpringBoot启动主类

(5)添加单元测试依赖

(6)添加Drools和lombok依赖

(7)创建订单实体类Order

(8)创建规则⽂件/resources/rules/score-rules.drl

(9)创建DroolsConfig配置类

(10)编写测试类

4.Drools基础语法

(1)规则文件的构成

drl是Drools Rule Language的缩写。在规则⽂件中编写具体的规则内容。

⼀套完整的规则文件内容构成如下:

  • package:包名,package对应的不⼀定是真正的目录,可以任意写com.abc,同⼀个包下的drl文件可以相互访问
  • import:用于导入类或者静态方法
  • global:全局变量
  • function:自定义函数
  • query:查询
  • rule end:规则体

(2)规则体语法构成

5.Drools条件语法部分

LHS(Left Hand Side):是规则的条件部分的通⽤名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。

(1)约束连接

  • 在 LHS 当中,可以包含 0~n 个条件,多个pattern之间可以采⽤“&&” (and) 、 “||”(or)和“,”(and)来实现,也可以不写,默认连接为and。
  • 测试代码

(2)比较运算符

  • 在 Drools当中共提供了⼗⼆种类型的⽐较操作符, 分别是: >、 >=、 <、 <=、 = =、 !=、contains、 not contains、memberof、not memberof、matches、not matches;在这⼗⼆种类型的比较操作符当中,前六个是⽐较常⻅也是⽤的⽐较多的⽐较操作符。

验证:

  • 创建订单项实体类
  • 订单中加入订单项集合
  • 测试contains 规则
  • 测试not contains 规则
  • 测试matches规则
  • 测试not matches规则
  • 测试memberOf规则
  • 测试not memberOf规则
6.Drools结果操作部分

在Drools当中,在RHS里面,提供了一些对当前Working Memory实现快速操作的宏函数或对象,比如insert/insertLogical、update和retract就可以实现对当前Working Memory中的Fact对象进行新增、删除或者是修改。

(1)insert/insertLogical函数

函数insert的作用与我们在java类当中调用StatefulKnowIedgeSession对象的insert方法的作用相同,都是将一个Fact对象插入到当前的Working Memory当中。

需注意:一旦调用 insert 宏函数,那么 Drools 会重新与所有的规则再重新匹配⼀次, 对于没有设置no-loop 属性为 true 的规则,如果条件满足,不管其之前是否执行过都会在执行,这个特性不仅存在于 insert 宏函数上,后⾯介绍的 update、retract 宏函数同样具有该特性,所以在某些情况下因考虑不周调用 insert、update 或 retract 容易发生死循环。

insertLogical:insertLogical 作⽤与 insert 类似,它的作用也是将⼀个 Fact 对象插入到当前的 Working Memroy 当中

(2)update函数

update函数意义与其名称⼀样, ⽤来实现对当前Working Memory当中的 Fact进⾏更新,⽤来告诉当前的 Working Memory 该 Fact 对象已经发生了变化。

(3)retract

retract用来将Wroking Memory当中某个Fact对象从Working Memory当中删除

测试方法还是上面那个

7.Drools内置属性部分

Drools中提供的属性

(1)salience

salience用来设置规则执行的优先级,salience属性的值是一个数字,数字越大执行优先级越高。默认情况下,规则的salience默认值为0。如果不设置salience属性,规则体的执行顺序为由上到下。

(2)no-loop

no-loop是用来控制已经执行过的规则在条件再次满足的时候是否再次执行。no-loop属性是一个布尔型默认情况下规则的no-loop属性的值为false,如果no-loop属性值为true,那么就表示该规则只会被引擎检查一次。

再次测试

(3)date-effective

date-effective的作用是来控制规则只有达到指定的时候后才会触发,只有当系统时间大于等于date-effective设置的时间值时,规则才会被执行。

date-effective 的值为⼀个日期型的字符串,默认情况下,date-effective 可接受的日期格式为 “dd-MM-yyyy”。

在实际使用中,如果不想使用这种格式,也可以通过java代码去设置System.setProperty(String key,String value)方法来修饰默认的时间格式。

(4)date-expires

date-expires的作用正好与date-effective属性恰恰相反,date-expires的作用时用来设置规则的有效期,引擎在执行规则的时候,会检查规则有没有date-expires属性,如果有的话,那么将这个属性与当前系统时间进行比较,如果大于系统时间就执行。

(5)enabled

enabled的作用就是定义一个规则是否可用。该属性的值是一个布尔值默认该属性的值为true,表示规则是可用的。设置enabled属性为false时,该规则引擎不会执行。

(6)dialect

dialect作用是用来定义规则当中要使用的语言类型,目前支持两种类型的语言,mvel和java,默认情况下,如果没有手工设置的话,默认使用java语言。

(7)activation-group

activation-group的作用是将若干个规则划分成一个组,用一个字符串来给这个组命名,在执行规则时,具有相同activation-group属性的规则中只要有一个会被执行,其他规则将不再执行。当然具有相同activation-group属性的规则中哪一个会先执行,可以设置salience属性来实现。

(8)agenda-group

agenda-group属性是一个字符串,不过通过这个字符串可以分为若干个AgendaGroup,默认情况下,引擎在调用这些设置了agenda-group属性的规则的时候需要显示的指定某个Agenda Group得到Focus,这样位于该Agenda Group当中的规则才会触发执行,否则将不执行。

(9)auto-focus

auto-focus的作用是在已经设置了agenda-group的规则上设置该规则是否可以自动独取Focus,如果该属性设置为true,那么在执行引擎时,就不需要设置Focus。

(10)timer

timer属性可以通过定时器的方式指定规则执⾏的时间,使⽤方式有两种

方式一:timer(int ?)

此方式遵循java.util.Timer对象的使用方式,第一个参数表示几秒后执行,第二个参数表示每隔几秒执行一次,第二个参数为可选。

方式二:timer(cron)

此方式使用标准的unix cron 表达式的使用来定义规则执行的时间。

8.Drools高级语法部分

(1)global全局变量

全局变量,一般用作执行规则后的结果数据返回或对具体某个服务调用等。在调用规则引擎的集成代码中,获取emailService对象,然后将其设置在工作内存中。

语法结构为:global对象类型 对象名称

(2)query查询

query语法提供了一种查询working memory中符合约束条件的FACT对象的简单方法。它仅包含规则文件中的LHS部分,不用指定"when"和"then"部分。Query有一个可选参数集合,每一个参数都可选的类型。如果没有指定类型,则默认为Object类型。引擎会尝试转为需要的类型。对于KieBase来说,query的名字是全局性的,因此不要向同一RuleBase的不同包添加相同名称的query。

使用ksession.getQueryResult(“name”)方法可以获得查询的结果,其中name为query的名称,方法的返回结果一个列表,从中可以获取匹配查询到的对象。

(3)function函数

在规则中可以通过函数来做一些通用的逻辑,就相当于java类中的方法一样。

最新文章
谷歌深夜发布Gemini 2.0,人工智能(159819)、软件30ETF(562930)备受关注
  消息面上,12月11日晚,刚刚发布量子芯片的谷歌,又投下一枚重磅炸弹,正式发布其最新版大模型Gemini 2.0系列,谷歌表示这是他们迄今为止最强大的人工智能模型,“专为智能体时代设计”,并同时介绍了多个智能体应用(AI Agent)。  
航海王鱼人岛篇特别编辑版
影片名称:航海王鱼人岛篇特别编辑版影片别名:影片类型:动漫影片导演:尾田荣一郎影片演员:田中真弓 , 冈村明美 , 中井和哉 , 山口胜平 , 平田广明 , 大谷育江 , 山口由里子 , 矢尾一树 , 长岛雄一 , 宝龟克寿年份地区:2024/日本更新时
规则引擎 drools_Java常用的规则引擎,让你变动的代码更加容易维护
在本文中,我们将介绍Java中一些最受欢迎的规则引擎。规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入
草根站长的源动力-国内站长网站缩影
随着互联网的发展,国内个人网站也迅速雨后春笋般迅速发展。犹如80年代的私营企业发展个人网站的故事也频繁登上各媒体的版面 非官方的统计:目前国内已经有草根站长300万个。已经开始盈利的个人网站 近5万个个人网站的总收入已经超过3亿 这
背包有个十字架的牌子 十大奢侈品包包排名及图标志
背包有个十字架的牌子,是一个备受关注的奢侈品包包品牌。随着时尚产业的发展和消费观念的改变,越来越多的消费者对于高品质、独特设计的包包有着强烈的需求。在这样的市场环境下,背包有个十字架的牌子以其独特的设计和卓越的品质迅速崛起
港股开盘:恒生指数开盘跌0.59%,恒生科指跌0.61%,美团跌近2%
金融界12月17日消息 港股恒生指数开盘跌0.59%,报19678.03点,恒生科技指数跌0.61%,报4387.62点,国企指数跌0.53%,报7095.14点,红筹指数跌0.1%,报3691.93点。大型科技股中,阿里巴巴-W跌0.53%,腾讯控股跌0.89%,京东集团-SW跌1.39%,
玩转serv00虚拟主机(一):零成本搭建wordpress个人博客&入门
不少童鞋在搭建博客、alist、图床等各类web服务的时候苦于云的成本望而却步,但其实搭建web服务也可以用虚拟主机,不少厂商都有免费的虚拟主机,但对于很多童鞋可能是第一次听说虚拟主机,这里就开一个新的系列,玩转serv00家的免费虚拟主
考研民商法学专业容易上岸的大学怎么选择
在准备考研的过程中,选择合适的学校是至关重要的一步。尤其是对于民商法学专业的考生来说,如何找到一所适合自己的学校更是需要认真考虑的事情。本文将为大家提供一份考研选择民商法学学校指南,帮助你在众多院校中做出明智的决定。首先,
老照片如何修复成高清?四个老照片修复教程全揭晓
让老照片焕发新生:给你分享老照片修复的精彩工具 提到老照片,很多人心中总是涌动着温暖的回忆。家人们,是否曾经翻阅过那些泛黄的照片,感受到那份岁月的沉淀?但时间的流逝总会导致照片的劣化,很多细节模糊甚至消失。那么,我们该如何
四川甜城旅游景点大全:热门景点排名及详细介绍
四川甜城即四川省内江市以其独有的地理位置和丰富的历史文化遗产而闻名遐迩。内江不仅是的“糖都”也是甜城文化的发源地。这里既有壮丽的自然景观又有深厚的历史文化底蕴是一个不可多得的旅游胜地。从古朴典雅的隆昌石牌坊到秀美宁静的甜城
相关文章
推荐文章
发表评论
0评