您当前的位置:首页 > 互联网教程

如何把drools的rules存放入到数据库中

发布时间:2025-05-23 12:45:44    发布人:远客网络

如何把drools的rules存放入到数据库中

一、如何把drools的rules存放入到数据库中

1、两年前我是这么做的,将xml文件按照数据结构进行分解放置到数据库中,要使用该规则再从数据库读取。使用设计模式中组合方法来分解的。

2、具体代码要有很多了,不过用递归也行,但是性能打点折扣。

3、我写了两周的,建议你自己和项目经理,架构师进行讨论,看如何贴合你们自己公司情况来实现了。

二、Drools规则引擎

Drools规则引擎1.什么是规则引擎

规则引擎的主要思想是将应用程序中的业务决策部分抽离出来,并使用预定义的语义模块编写业务决策,由用户或开发者在需要时进行配置管理。规则引擎产品有Drools、VisualRules、iLog等。

规则引擎的主要思想是将应用程序中的业务决策部分抽离出来,并使用预定义的语义模块编写业务决策,由用户或开发者在需要时进行配置管理。规则引擎产品有Drools、VisualRules、iLog等。

例如,在信用卡申请业务中,需要根据学历、收入、是否有房、是否有车判断是否符合信用卡申请要求以及可以申请的额度是多少。传统的做法是使用if...else的做法,代码量大,且不易修改。

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

信用卡申请业务通过规则引擎的处理就变成了这样:

系统引入规则引擎之后,业务规则不再以程序代码的方式驻留在系统中,取而代之的是处理规则的规则引擎,业务规则存储在规则库中,完全独立于程序。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更改、统计、提交业务规则等。业务规则被加载到规则引擎后,供系统的应用程序调用。

业务代码与系统代码分离,实现业务规则的集中管理;

在不重启服务的情况下,可以随时对业务规则进行扩展和维护;

可以动态修改业务规则,从而快速响应需求变更;

规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则;

减少了硬编码业务规则的成本和风险;

还可以使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得简单。

(1)风险控制系统--风险贷款、风险评估

(2)反欺诈项目--银行贷款、征信验证

(4)促销平台系统--满减、打折、加价购

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

Inference Engine(推理引擎):Pattern Matcher(匹配器)、Agenda(议程)、Execution Engine(执行引擎)

将初始数据(fact)输入至工作内存(working Memory)

使用匹配器(Pattern Matcher)将规则库中的规则(rule)和数据(fact)匹配,匹配成功的放入到议程(Agenda)中

如果执行规则存在冲突,即同时激活了多个规则,将冲突的规则放入冲突集合(冲突是同时匹配了多条规则,不需要自己处理,drools会自动处理)

解决冲突,将激活的规则按顺序放入议程(Agenda)

执行议程(Agenda)中的规则,重复2-4,直到执行完毕议程中的所有规则

package:包名,package对应的不一定是真正的目录,可以任意写com.abc,同一个包下的drl文件可以相互访问

import:用于导入类或者静态方法

contains:检查一个Fact对象的某个属性值是否包含一个指定的对象值

not contains:检查一个Fact对象的某个属性值是否不包含一个指定的对象值

memberOf:判断一个Fact对象的某个属性是否在一个或多个集合中

not memberOf:判断一个Fact对象的某个属性是否不在一个或多个集合中

matches:判断一个Fact对象的属性是否与提供的标准的Java正则表达式进行匹配

not matcher:判断一个Fact对象的属性是否不与提供的标准的Java正则表达式进行匹配

规则文件的RHS部分的主要作用是通过插入、删除或修改工作内存中的Fact数据,来达到控制规则引擎执行的目的。Drools提供了一些方法可以用来操作工作内存中的数据,操作完成后规则引擎会重新进行相关规则的匹配,原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。

update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。更新数据时,要注意防止陷入死循环。

insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配

retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配

salience:指定规则执行的优先级,用数字表示,数字越大优先级越高。如果不设置,默认从上到下执行

dialect:指定规则使用的语言类型,java或mvel

enabled:指定规则是否启用,取值为ture或false,默认为true

date-effective:指定规则生效的时间

date-expires:指定规则失效的时间

timer:定时器,指定规则触发的时间

activation-group:激活分组,同一个组内只能有一个规则触发

agenda-group:议程分组,只有获取焦点的组中的规则才有可能触发。在java代码中获得焦点。

auto-focus:自动获取焦点,一般结合agenda-group使用,取值为ture或false

no-loop:防止死循环,当规则使用update之类的函数修改了Fact对象时,使当前规则再次被激活从而导致死循环。

global关键字用于在规则文件中定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。可以用来为规则文件提供数据或服务。语法结构:global对象类型对象名称。

注意事项:如果对象类型为包装类时,在一个规则中改变了global的值,那么只针对当前规则有效,对其他规则中的global不会有影响。如果对象类型为集合类型或者javaBean时,在一个规则中改变了global的值,对java代码和所有规则都有效。

query查询提供了一种查询working memory中符合约束条件的Fact对象的简单方法。它仅包含规则文件中的LHS部分,不用指定"when"和"then"部分并且以end结束。具体语法结构如下:

function关键字用于在规则文件中定义函数,规则体中可以调用定义的function函数。使用函数的好处是可以将业务逻辑集中放置在一个地方,根据需要可以对函数进行修改。

复合值限制是指超过一种匹配值的限制条件,类似于SQL语句中的in关键字。

eval用于规则体的LHS部分,并返回一个Boolean类型的值。语法结构:eval(表达式)

not用于判断working memory中是否存在某个Fact对象,如果不存在则返回true,存在返回true。

exists与not相反,用于判断working memory中是否存在某个Fact对象,如果存在则返回true,不存在返回true。

规则之间使用extends关键字进行规则部分的继承,类似于java类之间的继承。

RHS部分需要进行业务处理。在RHS部分Drools提供了一个内置对象,名称是drools,介绍几个drools对象的方法。

halt方法的作用是立即终止后面所有规则的执行。

getRule方法的作用是返回工作内存中的对象。

getRule方法的作用是返回规则对象。

所有的规则文件(.drl)应统一放在一个规定的文件夹汇总,如:/rules文件夹

书写的每一个规则应该尽量加上注释

同一类型的对象尽量放在一个规则文件中,如所有的Student类型的对象尽量放在一个规则文件中

规则结果部分(RHS)尽量不要有条件语句,尽量不要有复杂的逻辑和深层嵌套

每个规则最好都加上salience属性,明确执行顺序

Drools默认dialect为"java",尽量避免使用dialect"mvel"

创建maven工程creditCardApply,并配置pom.xml

创建resources/application.yml文件

创建entity/CreditCardApply.java实体类

创建resources/rules/CreditCardApply.drl文件

编写配置类config/DroolsConfig.java

(1)创建maven工程creditCardApply,并配置pom.xml

(2)创建resources/application.yml文件

(3)创建entity/CreditCardApply.java实体类

(4)创建resources/rules/CreditCardApply.drl文件

(5)编写配置类config/DroolsConfig.java

三、什么是 Groovy

作为一种基于Java虚拟机的敏捷动态语言,Groovy构建在强大的Java语言之上,同时融合了Python、Ruby和Smalltalk等语言的诸多特性。

它为Java开发者提供了现代流行的编程语言特性,且学习成本几乎为零。支持DSL(领域特定语言)和其他简洁的语法,使得代码更加易读和维护。

在处理原生类型、面向对象以及Ant DSL方面,Groovy使得创建Shell Scripts变得非常简单。在开发Web、GUI、数据库或控制台程序时,通过减少框架性代码,大大提高了开发者的效率。

它还支持单元测试和模拟对象,可以简化测试。无缝集成所有已存在的Java对象和类库,直接编译成Java字节码,可以在任何使用Java的地方使用Groovy。

虽然Groovy的语法源于Smalltalk和Ruby的理念,但它与Java语言的语法相似,可以被视为一种更加简单、表达能力更强的Java变体。

使用Groovy时,会发现它使日常的编程活动变得更快。完成本教程后,将了解更多的Groovy语法快捷方式。如Groovy的松散Java语法允许省略分号和修饰符,除非另行指定,所有内容默认为public。

Groovy允许定义简单脚本,无需定义正规class对象,并在普通Java对象上增加了一些独特方法和快捷方式,使得它们更容易使用。语法允许省略变量类型。

虽然Groovy允许省略Java语法中的某些元素,但也增加了一些新特性,如本地集合、内置正则表达式和闭包。

闭包是Java开发人员感到兴奋的新技巧,可以在Groovy中使用。它们可以作为代码块,现在定义后稍后执行,简化迭代。

从技术上讲,Groovy是您最近听说过的类型最松散的动态语言之一。类型是可选的,无需输入如String myStr="Hello";即可声明String变量,使用def myStr="Hello";即可。

除此之外,Groovy代码可以在运行时轻松改变自己,这意味着可以在运行时轻松为对象指定新方法和属性。这一编程领域称为元编程,Groovy能够很好地支持。

用Groovy编写的任何内容都可以编译成标准Java类文件并在Java代码中重用,同样,用标准Java代码编写的内容也可以在Groovy中重用。

目前最新稳定版为Groovy1.8,由James Strachan和Bob McWhirter创造。James还参与了许多其他开源项目的开发,而Bob是Jaxen和Drools的创始人。