
Drools规则引擎
文章平均质量分 61
了解学习Drools规则引擎底层技术架构,并基于此规则引擎构建相应上层业务场景。包括风控、反洗钱等业务实现模型。QQ群:593177274,欢迎大家多多沟通交流。
程序新视界
个人公众号【程序新视界】,一个硬技术,软实力同步提升的平台。《Spring Boo技术内幕:架构设计与实现原理》作者,《深入以太坊智能合约开发》联合作者之一。主要从事于三方支付行业。
展开
-
Drools规则引擎之决策表从入门到精通
决策表是Drools规则引擎的重要应用场景之一。但学习决策表需要了解Drools基础语法知识,才能进一步进行学习。本文,为大家提供学习决策表相关的思路:第一章 Drools决策表介绍学习基础简介决策表简介决策表使用场景及特性第二章 入门&原理&操作讲解决策表生成DRL文件的两种方式决策表的入门示例决策表加载原理分析决策表的校验定义kmodule第三章...原创 2020-03-20 15:57:40 · 3828 阅读 · 0 评论 -
Drools规则引擎debug模式
在《Drools7 规则引擎视频教程》的交流群中,有同学提出这样的问题:对Drools规则引擎中的drl文件是否可以进行debug操作?如果不能改怎么办?首先来说debug的问题,drl文件不是不可以debug但是是有限制的:Eclipse或MyEclipse中安装插件,然后drl文件中的语法还需要是MVEL才可以支持debug。而默认基于Java语法的drl文件是没办法进行debug了。那...原创 2020-02-26 13:16:13 · 2645 阅读 · 0 评论 -
Drools规则引擎平台如何进行架构
在《Drools7 规则引擎视频教程》的交流群中,有同学提出这样的问题:如果不想使用Drools官方提供的Workbench和KIE-Server进行规则的管理,而自行进行相应系统研发,该如何设计相应的平台架构呢?首先,我们必须承认,Drools官方提供的Workbench和KIE-Server的确很厚重,而且对部署环境也有要求,想抛弃它们是很正常的。但如果你的团队没有太多的时间投入,选择使用它...原创 2020-02-25 15:01:02 · 2886 阅读 · 0 评论 -
Drools 规则引擎死循环问题解决
在《Drools7 规则引擎视频教程》中已经讲到,使用modify或update的时候在某种程度上会导致死循环。昨天一同学在使用Drools规则引擎时便遇到了该问题。下面看该同学贴出来的规则代码:首先我们来分析一下上面的代码,上面的代码中这位同学讲一个相同的Map,传递进入两个规则中,在规则的then部分中会对map的属性值进行更新。为了防止死循环他使用了no-loop属性。但是问题依旧存...原创 2020-02-22 17:50:07 · 3023 阅读 · 0 评论 -
Drools规则引擎视频教程
经过多半个月的加班加点,终于又完成了一套Drools规则引擎的视频教程。新增了Workbench和KIE Server的内容,而且后续还会持续更新。相关视频教程内容,可在优快云学院获得:https://edu.youkuaiyun.com/combo/detail/1575至此,关于Drools规则引擎的视频教程核心内容已经差不多完成。后续还会围绕实战进行更多内容的扩充。...原创 2020-02-16 17:50:15 · 1987 阅读 · 0 评论 -
Drools规则引擎-判断集合(List)是否包含集合
问题场景在使用Drools规则引擎时,有朋友会遇到这样的问题,就是在when部分判断的两个参数都是集合类型,比如两个List,此时要判断一个集合是否包含另外一个集合的内容。拿一个具体的例子来说明,我的公众号《程序新视界》接受商务合作有一定的要求,设置了对应行业的黑名单,比如:房地产、游戏和P2P领域的合作不接。那么此时,有一个广告商准备投放广告,而它投放的广告领域涵盖了教育和P2P,那么,在...原创 2019-07-14 15:41:58 · 6288 阅读 · 0 评论 -
Drools规则模板使用之Excel
规则模板简介规则模板是使用模板文件和表格数据源即时生成DRL规则的方法。表格数据源是指可以用表格中展示的数据,典型的介绍是数据库和Excel。如果根据存储在应用程序之外的数据来生成规则?解决方案之一就是:规则模板规则模板的优势规则的数据和结构完全分离相同的模板可用于不同的数据集同一数据集可用于不同的模板与决策表相比,提供了极大的灵活性。规模模板的语法结构template...原创 2019-01-25 14:39:59 · 5467 阅读 · 1 评论 -
Drools使用dsl语言
Drools 为了对非开发人员更加友好,提供了dsl语言的支持,通过dsl再转换成drl文件来进行执行。DSL简介DSL == Domain Specific Language以贴近业务领域的方式,即以类自然语言的方式来构造软件,使得我们不用花费太多精力就能看懂代码所对应的业务含义 。它是创建规则语言的一种方式,致力于解决我们的问题域 。DSL相当于一个转换器,它能将某一领域内的术语...原创 2019-01-24 18:26:39 · 3540 阅读 · 0 评论 -
Drools 6.4.0Final版本KieScanner内存泄漏Bug
如果你在使用Drools 6.4.0.Final版本之Drools7.0.0Beta1(不包括此版本)的drools或workbench,需要注意内存溢出问题。关于内存溢出的bug修复问题,请参考官方的issues:https://issues.jboss.org/browse/DROOLS-1199原文链接:http://www.choupangxia.com/topic/detail/9...原创 2019-01-18 08:23:15 · 952 阅读 · 0 评论 -
Drools集成CDI(二)
上节课《Drools集成CDI(一)》中我们介绍了CDI的基本使用,这节课带大家学习一下Drools如何集成CDI。添加依赖首先使用drools7的话需要在正常使用CDI的基础上添加drools-cdi的依赖:<dependency> <groupId>org.drools</groupId> <artifactId>dro...原创 2019-01-06 21:39:11 · 898 阅读 · 2 评论 -
Drools集成CDI(一)
Drools对CDI进行了很好的集成,本节课带大家先了解一下CDI的基本使用,在下一节课中再讲解如何在Drools中应用CDI。CDI简介CDI(Contexts and Dependency Injection 上下文依赖注入),是JAVA官方提供的依赖注入实现。@Inject是JSR330规范实现的,与spring中的@Autowired基本一样,但没有request属性。可参看文...原创 2019-01-04 09:55:20 · 1441 阅读 · 0 评论 -
Drools7.12不再支持workbench tomcat版本
留心的朋友会发现,在官网下载workbench时7.12及以后版本再也找不到tomcat8的影子了。事件Drools7.12不再支持workbench tomcat版本,在之前版本中还是存在着tomcat8版本的支持。上面的截图中已经没有tomcat的选项了,原因原因有两种,一种是官方提出的解释:7.12之后不再支持tomcat版本,除非有人愿意为此版本提供维护和支持。另外猜测的...原创 2019-01-02 12:15:15 · 2090 阅读 · 0 评论 -
Drools决策表的使用
Drools 决策表的使用决策表简介引用官方的话 决策表是一个“精确而紧凑的”表示条件逻辑的方式,非常适合商业级别的规则。 目前决策表支持xls格式和csv格式。决策表与现有的drools drl文件使用可以无缝替换。什么时候使用决策表规则能够被表达为模板+数据的格式,考虑使用决策表很少量的规则不建议使用决策表不是遵循一组规则模板的规则也不建议使用决策表决策表格式RuleSet原创 2017-12-19 22:34:23 · 11474 阅读 · 0 评论 -
《Drools 7 规则引擎教程》番外篇-规则条件匹配机制
问题场景QQ技术群(593177274)中有同学遇到这一个问题场景:在多条规则(比如3条)的when中使用了一个相同的静态方法,并在静态方法中打印相关的日志信息。同时,使用了AgendaFilter对规则进行了过滤。也就是说只包含部分规则(比如匹配一条规则的名字)的使用。在这种场景下,匹配到的那条规则会正常触发,这个毫无疑问,但执行规则引擎之后会有一个附加情况,那就是使用同一静态方法的三条规则都调用原创 2017-11-03 17:14:37 · 7771 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》番外篇之ruleflow-group合并
前奏本篇文章在与补充不同版本中ruleflow-group的使用说明,网上关于此属性的使用说明非常少。不同版本合并从Drools 6.5版本的说明文档到Drools 7版本的说明文档中都提到ruleflow-group和agenda-group进行合并(更早版本是否有类型情况,请阅读官方文档查证)。get方法已经被废弃,但依旧保留在代码中,但都返回相同的底层数据结构。当jBPM激活一个组时,它现在只原创 2017-10-28 18:57:04 · 4658 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》第5章 session使用说明
KieSession是用来与规则引擎进行交互的会话。在Drools 7当中分有状态的session和无状态的session:KieSession和StatelessKieSession。有状态session通过KieContainer可以获取KieSession,在kmodule.xml配置文件中如果不指定ksession的type默认也是有状态的session。有状态session的特性是,我们可原创 2017-09-24 10:56:42 · 5357 阅读 · 4 评论 -
《Drools7.0.0.Final规则引擎教程》番外实例篇——FactHandler使用案例
背景我们在使用以太坊相关的json-rpc借口发送交易时,往往会出现这种现象:交易已经发送出去,也获得了交易的hash值。dev模式的geth也在正常挖矿,可是问题是交易却迟迟未被确认。会发生此种类型的接口如:eth_sendTransactioneth_sendRawTransaction那么是什么原因导致此问题呢?今天就带大家了解一些导致此问题的原因。问题追踪除了上面的表象问题,我们还可以进步原创 2017-09-17 21:57:43 · 3830 阅读 · 3 评论 -
《Drools7.0.0.Final规则引擎教程》番外实例篇——Map使用案例
背景技术交流群中,不少朋友在问,如何在Drools规则文件中使用Map。今天就用实例带大家了解一下map的使用方法。实例代码测试部分代码:@Test public void testMapUsage() { KieSession kieSession = this.getKieSession("map-group"); Map<String, Person> m原创 2017-09-04 22:37:08 · 9153 阅读 · 1 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 Function函数
Function函数首先来看一下function函数的语法结构图: 函数是将语义代码放置在规则文件中的一种方式,就相当于java类中的方法一样。函数并不会比辅助类做更多的事情,实际上,编译器会在幕后生成助手类。使用函数的好处是可以将业务逻辑集中放置在一个地方,根据需要可以对函数进行修改。但它既有好处也有坏处。函数对于调用规则的后果部分操作是最有用处的,特别是只有参数变化但执行的操作完全相同时。这里原创 2017-08-22 16:43:56 · 6322 阅读 · 2 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 Query查询之基础
Query查询首先,我们先来看一下query的语法结构图: Query语法提供了一种查询working memory中符合约束条件的FACT对象的简单方法。它仅包含规则文件中的LHS部分,不用指定“when”和“then”部分。Query有一个可选参数集合,每一个参数都有可选的类型。如果没有指定类型,则默认为Object类型。引擎会尝试强转为需要的类型。对于KieBase来说,query的名字原创 2017-08-20 11:36:37 · 4354 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》番外实例篇——activation-group的多FACT对象
场景当我们使用activation-group时,默认会执行优先级最高的一个规则,然后其他规则不再执行,这也是此属性的基本特性。那么,大家是否考虑过这样一个问题,那就是如果在调用fireAllRules方法之前,insert了多个对象,那么应该触发几次规则?在其他属性的使用时,我们知道,如果插入多个对象,那么如果每个对象都符合同一规则条件就会执行多次,如果部分条件符合规则,就执行部分次。当我们即想使原创 2017-08-15 08:05:16 · 5283 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》番外实例篇——默认条件的陷阱
场景今天向大家介绍一个典型的具有陷阱的场景,虽然不常用,但是如果错误使用的话也会导致莫名其妙的问题。当我们向session中插入多个对象,如果这多个对象匹配到同一条规则时,fireAllRules方法返回命中的规则数就是插入对象的数目。但是有一个情况比较特殊,下面看看实例。实例下面是测试代码和规则内容:@Test public void testComment(){ KieS原创 2017-08-14 18:53:26 · 2815 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
global 全局变量global用来定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。通常,可以用来为规则文件提供数据或服务。特别是用来操作规则执行结果的处理和从规则返回数据,比如执行结果的日志或值,或者与应用程序进行交互的规则的回调处理。全局变量并不会被插入到Working Memory中,因此,除非作为常量值,否则不应该将全局变量用于规则约束的判断中。对规则引擎中的fact修改,规则原创 2017-08-11 12:53:24 · 5544 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》番外实例篇——获取规则名称和包名
场景在QQ(593177274)交流群中,有朋友问到这样一个问题,如果我执行了很多规则,调用fireAllRules方法只会返回触发了几条规则,那么我怎么知道哪些规则被触发了,并把这些触发的规则的名称存如数据库呢?其实这个问题很好解决,也是实践中必然会遇到的问题,为大家写了一个简单的示例。实践在前面的RHS语法章节中我们已经讲过预定义变量drools的简单实用,其实通过它就可以轻松的拿到规则相关的信原创 2017-08-11 07:49:09 · 4376 阅读 · 1 评论 -
《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用
前奏群组(QQ:593177274)交流中有朋友提出一个问题,怎么实现两个相同对象的插入和比较?相信很多朋友也遇到类似的问题,于是抽时间为大家写一段实例代码,后续代码会同步到GitHub中。下面简单介绍一下实现实例:场景向session中insert两个相同的对象,但对象的参数值有不同的地方,同时要求对两个FACT对象的属性进行判断,当同时满足(&&)时,通过规则校验,进行后续业务处理。下面,通过两原创 2017-08-07 18:52:36 · 4440 阅读 · 3 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.9 关键字
关键字从Drools 5开始引入了硬关键字和软关键字。硬关键字是保留关键字,在命名demo对象,属性,方法,函数和规则文本中使用的其他元素时,不能使用任何硬关键字。以下是必须避免的硬关键字: (1)true (2)false (3)null 软关键词只在它们的上下文中被识别,可以在其他地方使用这些词,尽管如此,仍然建议避免它们,以避免混淆。其中大多数关键字我们在前面的章节中已经介绍过。软关键原创 2017-08-06 10:41:57 · 2582 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息
注释像Java开发语言一样,Drools文件中也可以添加注释。注释部分Drools引擎是会将其忽略调的。单行注释使用“//”,示例如下:rule "Testing Comments"when // this is a single line comment eval( true ) // this is a comment in the same line of a pattern原创 2017-08-06 07:32:11 · 5123 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
结果条件在Java中,如果有重复的代码我们会考虑进行重构,抽取公共方法或继承父类,以减少相同的代码在多处出现,达到代码的最优管理和不必要的麻烦。Drools同样提供了类似的功能。下面我们以实例来逐步说明。 像下面最原始的两条规则,有相同的业务判断,也有不同的地方:package com.rules.conditionalimport com.secbro.drools.model.Custome原创 2017-08-04 21:29:13 · 4392 阅读 · 2 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
RHS语法使用说明RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息。RHS主要用于处理结果,因此不建议在此部分再进行业务判断。如果必须要业务判断需要考虑规则设计的合理性,是否能将判断部分放置于LHS,那里才是判断条件应该在的地方。同时,应当保持RHS的精简和可读性。 如果在使用的过程中发现需要在RHS中使用AND或OR来进行操作,那么应该考虑将一根规则拆分成多个规原创 2017-08-03 21:18:09 · 4759 阅读 · 1 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
4.4.3 约束(Pattern的一部分)前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约束条件。Person( 5 < 6 )从本质上来讲,它是JAVA表达式的一种增强版本(比如属性访问),同时它又有一些小的区别,比如equals方法和==的语言区别。下面我们就深入了解一下。访问JavaBe原创 2017-08-02 22:33:50 · 5263 阅读 · 1 评论 -
《Drools7.0.0.Final规则引擎教程》Springboot+规则重新加载
在《Drools7.0.0.Final规则引擎教程》之Springboot集成中文名介绍了怎样将Drools与Springboot进行集成,本篇博客介绍一下集成之后,如何实现从数据库读取规则并重新加载规则的简单demo。因本章重点介绍的是Drools相关操作的API,所有将查询数据库部分的操作省略,直接使用数据库查询出的规则代码来进行规则的重新加载。另外,此示例采用访问一个http请求来进行重新加载原创 2017-08-02 07:11:50 · 26071 阅读 · 9 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern
LHS简介在规则文件组成章节,我们已经了解了LHS的基本使用说明。LHS是规则条件部分的统称,由0个或多个条件元素组成。前面我们已经提到,如果没有条件元素那么默认就是true。 没有条件元素,官方示例:rule "no CEs"when // emptythen ... // actions (executed once)end// The above rule is int原创 2017-07-29 18:01:13 · 3870 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历
日历日历可以单独应用于规则中,也可以和timer结合使用在规则中使用。通过属性calendars来定义日历。如果是多个日历,则不同日历之间用逗号进行分割。在Drools中,日历的概念只是将日历属性所选择的时间映射成布尔值,设置为规则的属性,控制规则的触发。Drools可以通过计算当期日期和时间来决定是否允许规则的触发。 此示例首先需要引入quarts框架:<dependency> <gro原创 2017-07-27 21:03:35 · 2810 阅读 · 2 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器
定时器规则用基于 interval(间隔)和cron的定时器(timer),替代了被标注过时的duration 属性。timer属性的使用示例:timer ( int: <initial delay> <repeat interval>? )timer ( int: 30s )timer ( int: 30s 5m )timer ( cron: <cron expression> )time原创 2017-07-21 21:15:20 · 4284 阅读 · 3 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
activation-group该属性将若干个规则划分成一个组,统一命名。在执行的时候,具有相同activation-group 属性的规则中只要有一个被执行,其它的规则都不再执行。可以用类似salience之类属性来实现规则的执行优先级。该属性以前也被称为异或(Xor)组,但技术上并不是这样实现的,当提到此概念,知道是该属性即可。 实例代码:package com.rules rule "tes原创 2017-07-20 13:05:53 · 3604 阅读 · 0 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus
auto-focus在agenda-group章节,我们知道想要让AgendaGroup下的规则被执行,需要在代码中显式的设置group获得焦点。而此属性可配合agenda-group使用,代替代码中的显式调用。默认值为false,即不会自动获取焦点。设置为true,则可自动获取焦点。对于规则的执行的控制,还可以使用org.kie.api.runtime.rule. AgendaFilter来实现。原创 2017-07-19 11:03:17 · 3678 阅读 · 1 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
agenda-group规则的调用与执行是通过StatelessKieSession或KieSession来实现的,一般的顺序是创建一个StatelessKieSession或KieSession,将各种经过编译的规则添加到session当中,然后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAllRules 方法来触发、执行规则。在没有调用fireAl原创 2017-07-19 08:28:33 · 6327 阅读 · 1 评论 -
《Drools7.0.0.Final规则引擎教程》之Springboot集成
本来准备按部就班的一章一章更新Drools相关教程,怎么QQ群组(593177274)有朋友继续Springboot与Drools的集成demo,于是抽出时间写了一个,现在拿出来分享一下。加入群组可免费下载demo,也可以在优快云下载频道下载:Springboot&Drools demopom文件引入了springboot和drools的依赖,同时引入了kie-spring的集成依赖。<depen原创 2017-07-18 17:30:23 · 21450 阅读 · 14 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
ruleflow-group在使用规则流的时候要用到ruleflow-group属性,该属性的值为一个字符串,作用是将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用对应的规则。该属性会通过流程的走向确定要执行哪一条规则。在规则流中有具体的说明。 代码实例:package com.rulesrule "test-ruleflow-group1"原创 2017-07-18 13:43:37 · 7982 阅读 · 4 评论 -
《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active
lock-on-active当在规则上使用ruleflow-group属性或agenda-group属性的时候,将lock-on-active 属性的值设置为true,可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行。可以看出该属性与no-loop属性有相似之处,no-loop属性是为了避免Fact被修改或调用了insert、retract、update之类的方法而导致规则再次激活执原创 2017-07-16 19:00:04 · 6688 阅读 · 0 评论