一种Drools规则引擎封装模型及其实现
- 格式:pdf
- 大小:1.15 MB
- 文档页数:5
[Drools]JA V A规则引擎(非常好的一篇教程)Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。
本文所使用的demo已上传/source/30022131、Drools语法开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。
在drools中,这个传递数据进去的对象,术语叫Fact对象。
Fact 对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean 插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。
规则文件可以使用.drl文件,也可以是xml文件,这里我们使用drl文件。
规则语法:package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。
特别的是,package的名字是随意的,不必必须对应物理路径,跟java的package的概念不同,这里只是逻辑上的一种区分。
同样的package下定义的function和query等可以直接使用。
比如:package com.drools.demo.pointimport:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。
Drools引擎一、drools是什么Drools是为Java量身定制的基于RETE算法的规则引擎的实现。
具有了OO(面向对象)接口的RETE,使得商业规则有了更自然的表达。
Rule是什么呢?一条规则是对商业知识的编码。
一条规则有 attributes ,一个 Left Hand Side ( LHS )和一个 Right Hand Side ( RHS )。
Drools 允许下列几种:attributes:salience,agenda-group,no-loop,auto-focus,duration,activation-group。
1.salience功能:设置规制执行的优先级值:数字(数字越大执行优先级越高)示例:rule "rule1"salience 1wheneval(true)thenSystem.out.println("rule1");end2.no-loop功能:控制已经执行的规则条件再次满足是否再次执行值:true/false示例:rule "rule1"no-loop truewhen$customer:Customer(name=="张三")thenupdate($customer);System.out.println("customer name:"+$customer.getName());End3.activation-group功能:若干个规则划分成一个组值:分组名称示例:rule "rule2"activation-group "test"salience 10wheneval(true)thenSystem.out.println("rule2 execute");endrule "rule1"activation-group "test"salience 9wheneval(true)thenSystem.out.println("rule1 execute");endnote:如果同一组规则,谁的salience高就执行谁,没有则按顺序执行最后同组最后那个规则4.date-expires功能:当系统时间<=date-expires后才会触发值:日期默认格式为dd-MMM-yyyy可以设置其它时间格式如yyyy-MM-dd,需在代码设置系统时间格式System.setProperty("drools.dateformat", "yyyy-MM-dd");示例:rule "rule1"date-expires "2009-09-27"wheneval(true);thenSystem.out.println("rule1 is execution!");end5、duration:规则定时,duration 3000 3秒后执行规则6、agenda-group:规则的调用与执行是通过Stateless KieSession或KieSession来实现的,一般的顺序是创建一个Stateless KieSession或KieSession,将各种经过编译的规则添加到session当中,然后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAll Rules 方法来触发、执行规则。
规则引擎Drools(一):第一个Drools工程准备•JDK 1.7+•Maven 3•IDE,Eclipse or IntelliJ IDEA开始新建一个干净的 Maven 工程,开始第一个 Drools 工程吧编辑pom.xml文件,定义 Drools 版本属性:<drools.version>6.4.0.Final</drools.version>编辑pom.xml文件,添加依赖:<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-ci</artifactId><version>${drools.version}</version></dependency>在src/main/resources/META-INF目录下,新建文件kmodule.xml文件:<?xml version="1.0" encoding="UTF-8"?><kmodule xmlns="/kie/6.0.0/kmodule"><kbase name="rules" packages="rules"><ksession name="ksession-rules"/></kbase></kmodule>在src/main/resources/rules目录下,新建文件test.drl文件:package rules;rule "test"whenthenSystem.out.println("it works!");end新建 Java 类文件App.java:public class App {public static void main(String[] args) {KieServices kieServices = KieServices.Factory.get();KieContainer kieContainer = kieServices.newKieClasspathContainer();KieSession kieSession = kieContainer.newKieSession("ksession-rules");kieSession.fireAllRules();kieSession.destroy();}}运行运行结果:it works!。
Drools5规则引擎规则引擎开发开发教程教程教程高杰上海锐道信息技术有限公司2009-8-201.学习前的准备Drools是一款基于Java的开源规则引擎,所以在使用Drools之前需要在开发机器上安装好JDK环境,Drools5要求的JDK版本要在1.5或以上。
1.1. 开发环境搭建大多数软件学习的第一步就是搭建这个软件的开发环境,Drools也不例外。
本小节的内容就是介绍如何搭建一个Drools5的开发、运行、调试环境。
1.1.1.下载开发工具Drools5提供了一个基于Eclipse3.4的一个IDE开发工具,所以在使用之前需要到网站下载一个 3.4.x版本的Eclipse,下载完成之后,再到/drools/downloads.html网站,下载Drools5的Eclipse插件版IDE及Drools5的开发工具包,如图1-1所示。
图1-1除这两个下载包以外,还可以把Drools5的相关文档、源码和示例的包下载下来参考学习使用。
将下载的开发工具包及IDE包解压到一个非中文目录下,解压完成后就可以在Eclipse3.4上安装Drools5提供的开发工具IDE了。
1.1.2.安装Drools IDE打开Eclipse3.4所在目录下的links目录(如果该目录不存在可以手工在其目录下创建一个links目录),在links目录下创建一个文本文件,并改名为drools5-ide.link,用记事本打开该文件,按照下面的版本输入Drools5 Eclipse Plugin文件所在目录:path=D:\\eclipse\\drools-5.0-eclipse-all这个值表示Drools5 Eclipse Plugin文件位于D盘eclipse目录下的drools-5.0-eclipse-all 下面,这里有一点需要注意,那就是drools-5.0-eclipse-all文件夹下必须再包含一个eclipse 目录,所有的插件文件都应该位于该eclipse目录之下,接下来要在win dos下重启Eclipse 3.4,检验Drools5 IDE是否安装成功。
使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性,降低应用程序的维护和可扩展性成本。
本文展示了如何使用Drools规则引擎让Java™ 应用程序更适应变化。
Drools的一个好处是具有允许将Java 代码直接嵌入规则文件中的附加语法。
要求施加在当今软件产品上的大多数复杂性是行为和功能方面的,从而导致组件实现具有复杂的业务逻辑。
实现J2EE 或J2SE 应用程序中业务逻辑最常见的方法是编写Ja va 代码来实现需求文档的规则和逻辑。
在大多数情况下,该代码的错综复杂性使得维护和更新应用程序的业务逻辑成为一项令人畏惧的任务,甚至对于经验丰富的开发人员来说也是如此。
任何更改,不管多么简单,仍然会产生重编译和重部署成本。
规则引擎试图解决(或者至少降低)应用程序业务逻辑的开发和维护中固有的问题和困难。
可以将规则引擎看作实现复杂业务逻辑的框架。
大多数规则引擎允许您使用声明性编程来表达对于某些给定信息或知识有效的结果。
您可以专注于已知为真的事实及其结果,也就是应用程序的业务逻辑。
有多个规则引擎可供使用,其中包括商业和开放源码选择。
商业规则引擎通常允许使用专用的类似英语的语言来表达规则。
其他规则引擎允许使用脚本语言(比如Groovy 或Python)编写规则。
本文为您介绍Drools引擎,并使用示例程序帮助您理解如何使用Drools作为Java 应用程序中业务逻辑层的一部分。
引擎,使用Rete 算法(参阅参考资料)对所编写的规则求值。
Drools允许使用声明方式表达业务逻辑。
可以使用Java/XML 语法编写规则,这对于入门Drools十分有用,因为您可以将Java 代码直接嵌入规则文件中。
还可以使用Groovy/XML 语法或Python/XML 语法在Drools中编写规则。
Drools还具有其他优点:∙非常活跃的社区∙易用∙快速的执行速度∙在Java 开发人员中流行∙JSR 94 兼容(JSR 94 是Java Rule Engine API)(参阅参考资料)∙免费因此,您应该熟悉使用Eclipse IDE 开发Java 代码。
SpringBoot整合Drools规则引擎动态⽣成业务规则的实现最近的项⽬中,使⽤的是flowable⼯作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页⾯去动态配置改变,所以就花了⼏天时间去研究了⼀下Drools规则引擎框架。
然后应⽤到了项⽬中。
⾸先在项⽬中引⼊规则引擎相关依赖<properties><java.version>1.8</java.version><drools.version>7.20.0.Final</drools.version></properties><dependencies><!--引⼊规则引擎--><dependency><groupId>org.kie</groupId><artifactId>kie-spring</artifactId><version>${drools.version}</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope><version>1.18.20</version></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></build>这⾥的drools版本使⽤的是7.20.0.Final,如果想和Flowable结合使⽤,在流程画图中插⼊规则任务,可以将drools版本和flowable starter中管理的drools版本⼀致,⽐如我现在的项⽬中⽤到的flowable-srping-boot-starter的依赖版本是6.5.0,点进去这个jar包的pom⽂件再进⼀步点parent标签然后再点parent标签的依赖然后再点parent标签内的flowable-root,然后搜索drools可以看到flowable starter集成管理的drools版本是7.6.0-Final,所以最好和这个版本保持⼀致当然你需要在flowable modeler画图项⽬中引⼊,然后启动flowable modeler程序,在画图界⾯任务类型中就可以看到⼀个Business rule task,商业规则任务。
第26卷第6期2005年11月微计算机应用MICROCOMPU IER A PPL ICA TIONS Vol.26No.6Nov.2005本文于2004-12-13收到。
Java 规则引擎———Drools 的介绍及应用刘 伟(中国科技大学 合肥 230026) 摘 要:规则引擎技术是一项很有吸引力的技术。
首先介绍了规则引擎的相关概念及其实现原理。
然后重点介绍了J ava 规则引擎技术的规范和一个采用XML 和java 语言实现的规则引擎———Drools 。
最后给出了利用Drools 解决实际问题的范例并探讨了该技术的不足和发展前景。
关键词:规则引擎,JSR 94,DroolsIntroduction and Implementation of Drools ———a Rule E ngine B ased JavaL IU Wei(Univ of Sci &Tech of China ,Hefei ,230026,China )Abstract :Rule Engine is a magnetic technology in the area of software developing now.In this paper ,firstly ,the concept and implementing principle of Rule Engine is introduced ,and then J SR94,the Java programing specification of Rale Engine is presented.As a product of Java Rule Engine ,Drools ,is emphasized smbsequently.providing an actual example ,the paper describes the details of the usage of Drods finally.K eyw ords :Rule Engine ,J SR94Drools1 基于规则的专家系统简介Java 规则引擎是推理引擎的一种,它起源于基于规则的专家系统。
2.2Rete算法Rete在拉丁文中是网络的意思,Rete算法实现可分成两个部分:规则编译(RnleC伽pilation)秘运行时执行《Runtimeexecution)‘删删。
2.2.1规则编译规则编译描述的是如何将缓存中的规贝}j梅建生成一个有效的网络,这个网络就是用来过滤数据的,就如同产生数据一样。
在顶端,有很多节点要匹配,随着深入到网络的底层,需要匹配的节点将交少,到了这个网络的最底端就是到了网络的终点。
Rete算法中主要涉及到4种节点:根节点,单输入节点,双输入节点,终节点。
Rete算法中涉及的节点类型如图2-1所示(注:本论文涉及到Rete规则都采用通用规则表示法…1,如本图所示)。
图2-1Rete算法中的节点类型根节点ReteNode是所有对象进入Rete网络的入口。
从根节点,对象可以直接到达ObjectTypeNode节点,ObjectTypeNode节点保存了规则引擎中涉及到的事实对象的类型,规则引擎该把对象传递给匹配对象类型的节点,以确保规则引擎不做多余的工作。
例如有两个对象:account和order,如果规则引擎试图计算所有单个节点的值,那么它将浪费很多的资源,示例图如图2屯所示。
如果应用程序声明了一个account对象,那么它将不会由于order对象而产生任何节点。
当一个对象被创建时,它将通过查找一个HashMap找回西南交通大学硕士研究生学位论文第14页一个ObjectTypesNode的列表。
如果这个列表不存在,那么它将浏览所有的ObjectTypeNode,来查找被缓存在List中的有效匹配。
这确保drools能根据对象类的类型匹配。
ObjectTypdeNode节点可以传递到AlphaNode节点、LeftInputhdapterNode节点和BetaNode节点。
hlphaNode节点用来计算字面条件约束。
1982年Rete算法发表的时候只是支持相等的操作,但是现在Rete算法的实现支持很多的操作。
drools动态生成规则Drools动态生成规则Drools是一款基于Java的规则引擎,用于解决复杂的业务逻辑问题。
其最大的特点就是能够动态生成规则,实现业务规则的灵活性和可扩展性。
本文将介绍Drools动态生成规则的应用场景和实现方法。
一、动态生成规则的应用场景动态生成规则可以应用于许多领域,如金融、医疗、物流等。
以下是几个常见的应用场景:1. 金融领域:根据客户的信用评分和贷款需求,动态生成贷款审批规则,实现自动化的贷款审批流程。
2. 医疗领域:根据患者的病症和病史,动态生成诊断规则,帮助医生快速准确地诊断疾病。
3. 物流领域:根据货物的重量、体积和目的地等信息,动态生成运输规则,实现最优化的运输方案。
二、动态生成规则的实现方法Drools提供了一套丰富的API,用于动态生成规则。
以下是实现动态生成规则的步骤:1. 创建规则模板:首先,我们需要创建一个规则模板,定义规则的结构和规则变量。
规则模板可以使用DRL(Drools Rule Language)语法编写。
2. 构建规则引擎:使用Drools提供的API,构建一个规则引擎,用于执行规则。
规则引擎可以加载规则模板,并根据规则变量生成规则。
3. 设置规则变量:在生成规则之前,我们需要设置规则变量的值。
规则变量可以是任意类型的数据,如字符串、数字、日期等。
4. 生成规则:根据规则模板和规则变量,动态生成规则。
生成的规则可以通过DRL语法进行描述,可以包含条件、动作和规则属性等。
5. 执行规则:将生成的规则应用到实际的业务场景中,执行规则引擎。
规则引擎会根据规则的条件和数据,匹配符合条件的规则,并执行相应的动作。
三、示例:动态生成贷款审批规则为了更好地理解动态生成规则的应用,我们以贷款审批为例进行说明。
假设我们的贷款审批规则有以下几个条件:客户的年龄大于等于18岁、月收入大于5000元、信用评分大于等于700分。
如果满足这些条件,则通过贷款审批,否则拒绝贷款申请。