JBoss Drools –入门

这篇文章是关于我如何掌握JBoss Drools的 。 其背后的原因是:SAP收购了我公司当前的规则引擎,而Drools是我们将寻找的另一种选择,只要有人掌握了概念验证的技能即可。

尽管似乎有大量的文档,但是我总是会通过示例来发现它是有帮助的,这就是我在这里要做的事情。乍一看,流口水令人生畏,它由以下内容组成:

Drools Expert (规则引擎)
作为开发人员,这是我将开始的地方,它们的实际规则和实现。

我稍后将讨论的其他部分是:
Drools Guvnor (BRMS / BPMS)
流口水流程 (流程/工作流程) Drools Fusion (事件处理/时间推理) Drools Planner (自动计划)

因此开始。
首先,我只想弄湿我,只下载Eclipse插件和二进制文件

需要安装Eclipse插件,用于更新站点 。 将二进制文件解压缩到目录,然后将Eclipse插件设置指向该目录。

eclipse插件将允许您创建一个Drools项目,其中包括“ Drools库”,但是如果您正在使用Maven,则需要指向Drools依赖项的JBoss版本库 ,KnowledgeRuntimeLoggerFactory需要XStream,您可以从中获取标准的Maven回购。 以下是我的POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelversion>4.0.0</modelVersion><groupId>javaitzen.drools</groupId><artifactid>LearningToDrool</artifactId><version>0.0.1-SNAPSHOT</version><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></build><properties><drools.version>5.1.1</drools.version></properties><repositories><repository><name>JBoss</name><id>JBoss</id><url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url></repository></repositories><dependencies><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.drools</groupId><artifactId>drools-api</artifactId><version>${drools.version}</version></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.3.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.1</version><scope>test</scope></dependency></dependencies></project>

要添加规则,请在src / main / rules上单击鼠标右键->新建->其他... Drools / Rule Resource,确保选择“单个规则”。 这给您留下了一个空的drl文件:

package javaitzen.drools.rulesrule "A stand alone rule"when#conditionsthen #actions  
end

为了理解和使用规则语言,我阅读了Drools文档和示例项目。
实际上让我有点掌握的是基本语法以及规则中对象的处理方式,我确实很难找到任何可以简单解释其内容的内容,因此我将对其进行介绍。

关于变量名的注释..它们不需要具有'$',但是在示例中使用了它,没有它,很快就会变得很混乱。

现在逐步了解规则的各个部分:

package javaitzen.drools.rulesimport javaitzen.drools.RoolVOrule "Basic Rule"when$vo : RoolVO( stringValue == "Learning to drool", $booleanVal : booleanValue )eval( $booleanVal )then System.out.println( "First Rule" ); $vo.setStringValue("Done."); 
end

包和import关键字很容易解释,在when之后不会发生什么。
实际上,分解为“ $ vo:RoolVO(stringValue ==“学习流口水”,$ booleanVal:booleanValue)”中的内容是:

stringValue ==“学习流口水” –这是一个约束,它使我们能够找到知识库中所有具有getStringValue()值等于“学习流口水”的RoolVO对象。 如果有多个符合RoolVO的实例,我们将多次运行此规则,这些实例也称为匹配对象。 您还可以有多个约束,以“,”分隔。

$ booleanVal:booleanValue –我们正在声明一个名为$ booleanVal的布尔类型的新局部变量,并从isBooleanValue中获取它的值。

$ vo:RoolVO –我们正在声明一个名为$ vo的RoolVO类型的新局部变量。

下一行:
“ eval($ booleanVal)” –计算布尔变量,对于要调用的规则的“ then”部分,需要将其评估为true。
然后: System.out.println(“第一条规则”); –标准系统输出。 $ vo.setStringValue(“ Done。”); –将与约束匹配的当前RoolVO对象上的String值设置为Done。

基本规则执行所需的主要类/接口如下:
org.drools.KnowledgeBase及其工厂
org.drools.KnowledgeBaseFactory: 这是所有相关知识定义的存储库; 它包含规则,流程,功能,类型模型。

org.drools.builder.KnowledgeBuilder及其工厂org.drools.builder.KnowledgeBuilderFactory:
将源文件(.drl,.xsl)转换/解析为KnowledgeBase可以理解的KnowledgePackage。

由知识库创建的StatefulKnowledgeSession .newStatefulKnowledgeSession();
该会话用于与实际规则引擎进行通信。

引用Drools JavaDocs:
StatefulKnowledgeSession是与规则引擎进行交互的最常用方法。 StatefulKnowledgeSession允许应用程序与引擎建立迭代对话,对于同一组数据,推理过程可能会被多次触发。

我为前面描述的规则编写了一个简单的测试。

package javaitzen.drools;import static org.junit.Assert.assertEquals;import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.junit.Before;
import org.junit.Test;public class TestBasicRules {private KnowledgeBase kbase;@Beforepublic void setup() {KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource("basic.drl"), ResourceType.DRL);KnowledgeBuilderErrors errors = kbuilder.getErrors();if (errors.size() > 0) {for (KnowledgeBuilderError error: errors) {System.err.println(error);}throw new IllegalArgumentException("Could not parse knowledge.");}kbase = KnowledgeBaseFactory.newKnowledgeBase();kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());}@Testpublic void testBasic() {StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");RoolVO vo = new RoolVO();vo.setStringValue("Learning to drool");vo.setBooleanValue(true);ksession.insert(vo);ksession.fireAllRules();for (Object o: ksession.getObjects()) {if(o instanceof RoolVO) {assertEquals("Done.", ((RoolVO) o).getStringValue());}} logger.close();}}

老实说,从我在第一个任务中所见,Drools并不像Quickrules那样直观。 但是,在下面,我将开始研究使用规则流,决策表功能以及指导规则:

那些与DSL(特定域语言)构造合作的人希望确实允许创建更直观的规则。

以前,我经历了基本语法和要求,以开发和测试规则。
现在扩展一下,Drools文档实际上是相当不错的,只有一堆,所以我将尝试仅关注一些主要主题。

首先,我需要做一些事情以使规则能够使用maven从您的测试中运行,默认情况下,.drls不在类路径中,一种简单的解决方法是将以下内容添加到POM中:

<build><resources><resource><directory>src/main/rules</directory></resource></resources>
</build>

现在,更多规则场景和用法:

集合:
查询a的内容可以通过2种方式完成,contains和memberOf,区别在于与memberOf一起使用的集合必须是变量。

DRL:

rule "Use a Collection"when$vo : RoolVO( listValue contains  "items" )then  $vo.setStringValue("Done.");logger.log(Level.INFO,"Used a collection");
end

常用表达:
您还可以将正则表达式与关键字Matches和Not Matches用作选择标准。

DRL:

rule "Use a Regular Expression"when$vo : RoolVO( stringValue matches  "(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)")then  $vo.setStringValue("Done.");logger.log(Level.INFO,"Found the date with a regular expression dd/mm/yyyy");
end

全局变量:
您可以定义全局变量,不应在代码中有时使用全局变量,以在方法之间或在这种情况下在规则之间传递信息。 而是应使用它们来提供规则使用的数据或服务。 一个示例可能是某个特定于应用程序的记录器,或者可能是在应用程序启动时加载的恒定查找数据。

考试:

public class TestBasicRules {private KnowledgeBase kbase;private Logger javaLogger = Logger.getLogger("testLogger");@Testpublic void testGlobal() {StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();RoolVO vo = new RoolVO();vo.setStringValue("Global");ksession.insert(vo);ksession.setGlobal("logger", javaLogger);ksession.fireAllRules();checkDone(ksession);    }

DRL:

package javaitzen.drools.rulesimport javaitzen.drools.RoolVO
import java.util.logging.Levelglobal java.util.logging.Logger logger;rule "Use a Global "when$vo : RoolVO( stringValue == "Global")then  $vo.setStringValue("Done.");logger.log(Level.INFO,"Logging with a global"); 
end

规则属性:
根据规则,您可以指定属性,其中有许多。 我只提到几个方便的地方(引用官方文档):

无环
默认值:false
类型:布尔型 当规则的结果修改事实时,可能导致规则再次激活,从而导致递归。 将no-loop设置为true意味着将忽略为当前数据集创建激活的尝试。

显着性
默认值:0
类型:整数 显着性是一种优先级形式,在激活队列中对具有较高显着性值的规则进行排序时,将赋予它们较高的优先级。

方言
默认值:由软件包指定
类型:字符串 可能的值:“ java”或“ mvel” 该方言在LHS或RHS代码块中的任何代码表达式中都使用了该语言。 当前有两种方言可用,Java和MVEL。 虽然可以在包级别指定方言,但此属性允许包定义被规则覆盖。

生效日期
默认值:不适用
类型:字符串,包含日期和时间定义 仅当当前日期和时间在日期生效属性之后时,规则才能激活。

日期过期
默认值:不适用
类型:字符串,包含日期和时间定义 如果当前日期和时间在date-expires属性之后,则无法激活规则。

指导规则:
指导性规则编辑器似乎允许您在代码中可以做的所有事情,无论是视觉上还是对于那些非开发人员而言都可能更直观。 唯一需要做的就是确保将要使用的对象导入到.package中与创建的.brl文件相同的位置。

决策表:
我认为世界实际上是在电子表格上运行的。 我们都喜欢认为它仅是因为我们和我们的高级应用程序才起作用,但事实是,与任何其他单个应用程序相比,全世界都将错失电子表格。

满足我们需求的业务人员了解电子表格,其中一些表格比我们的开发人员更好,这是决策表上最大的一笔奖励。 乍一看,Drools决策表看上去确实不像Quickrules那样简单地交付给业务用户,但实际上它被清晰地分为“代码”和“数据”。

现在将决策表分解为各个部分……
在创建决策表时,eclipse插件为您提供了一个示例,我将通过该示例进行工作。

C2:关键字规则集,仅说明此电子表格是一个规则集(程序包)。
D2:规则集(程序包)名称。
在此行下,您可以指定以下可选关键字: 顺序-右侧的单元格可以为true或false。 如果为true,则使用显着性来确保规则从上到下触发。 导入–右侧的单元格包含要导入的类的逗号分隔列表。 变量–右边的单元格可以包含Drools支持的全局声明。 这是一种类型,后跟一个变量名。 (如果需要多个变量,请用逗号分隔)。

C3 / D4:注释标题和实际注释。

C5:RuleTable关键字和名称。 “ RuleTable”关键字必须出现在第一个条件列的顶部。 您可以在工作表上有多个规则表,它们必须仅由一行隔开。

C6:将列标记为CONDITION列,G6,为ACTION执行此操作。 您需要至少一个表才有效。 如果“条件”列中没有数据,则该条件不适用。
其他列可选关键字是:
优先级–这表明该列的值将设置显着性 持续时间–这将设置规则行的持续时间值。 NO-LOOP –与drl中的相同,它指定是否不允许循环规则。

C7:该行以及此行中的后续列定义规则表中引用的实际变量。

C8:行中的此列和后续列指定我们从何处获取数据。

第9行和B列只是标签/标题,使数据更易于理解,可以隐藏所有其他字段和列,以免吓到“技术含量较低”的人。 然后,B9内部的表就是非开发人员定义的特定规则数据,希望直接从规范中定义。

我已经将此项目上载到我的Google代码项目中,以防有人需要。 我的决策表有一个小问题,因为我是在家里而不是在Microsoft Office上运行OpenOffice,该插件需要Excel,因此它在我的项目中留下了一个难看的红色X,但是它在IDE外部可以很好地打开,并且仍然可以在Maven中进行编译。

在下一篇文章中,我将看一看“规则流”,然后开始处理古弗诺尔怪兽

参考: 学习流口水……第1部分和学习流口水……第2部分来自我们的JCG合作伙伴   Zen博客中的Zen领域的 Brian Du Preez。


翻译自: https://www.javacodegeeks.com/2012/02/jboss-drools-getting-started.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android使用bintray发布aar到jcenter

前言 这两天心血来潮突然想把自己的android library的aar放到jcenter里面&#xff0c;这样一来自己便可以在任何时间任何地点通过internet得到自己的library的引用了&#xff0c;况且现在android studio已经默认使用jcenter的repositories作为依赖来源&#xff0c;以前的mavenc…

PHP 进程详解

PHP 进程详解PHP 进程详解 如下内容从《操作系统精髓与设计原理》中总结提炼得出&#xff0c;删除了大部分对于理解进程有干扰的文字&#xff0c;对进程知识结构进行的梳理。几乎所有内容为按照书本上摘抄下来的&#xff0c;我目前还总结提炼不出像作者这么深刻的见解。那么就先…

java都要caps标点_第 1 章 管理 Java CAPS 用户

第 1 章 管理 Java CAPS 用户在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用户的信息。如果您有任何问题&#xff0c;请参见 http://goldstar.stc.com/ 中的 Java CAPS Web 站点。管理系统信息库用户此类别包含以下用…

基于OpenCV 的美颜相机推送直播流

程序流程&#xff1a; 1.图像采集 先从opencv&#xff08;2.4.10版本&#xff09;采集回来摄像头的图像&#xff0c;是一帧一帧的 每一帧图像是一个矩阵&#xff0c;opencv中的mat 数据结构。 2.人脸的美化 人脸美化&#xff0c;我们用的皮肤检测&#xff0c;皮肤在颜色空间是特…

Spring线程池服务

线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步骤1&#xff1a;建立已完成的专案 创建一个Maven项目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛

虽然这句话很绕口&#xff0c;其实意思很简单&#xff0c;那就是之前的隐身药水没有什么用&#xff0c;该被打还是被打。因为这个可是害惨了流浪商人&#xff0c;不过这次好了&#xff0c;流浪商人在喝了隐身药水之后就能安全度过晚上了。NO.3 皮革马铠马铠是属于马的盔甲&…

欧莱雅眉笔banner个人设计

眉笔名称&#xff1a;眉笔大师三头塑形眉笔 &#xff0c;之所以没用吧这个商品名称放大&#xff0c;是我觉得它是一个名称&#xff0c;而我把自己想的广告词“出彩只需一笔” 放大不仅能凸显出这只笔的强大&#xff0c;还表示了一种有了我这支眉笔你会更出彩更漂亮&#xff0c…

使用带有注释和JQuery的Spring MVC 3的Ajax

与Ajax一起工作对我来说一直很有趣&#xff01; 是不是 &#xff1f; 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用。 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax。 和往常一样&#xff0c;我们将在Spring MVC 3框架中以Ajax的实际示例为例&#xff0c;并将其…

java百度云文件上传_关于如何在自己项目集成百度云BCE文件上传STS方案

1、 项目背景由于本人项目需要&#xff0c;需要在视频点播服务之中需要加载字幕文件(通用格式srt)&#xff0c;经过比较好几家的公有云服务&#xff0c;最后选择只有百度云提供字幕服务。字幕&#xff1a;我们通常在观看外语电影的是&#xff0c;没有国语版时候只能通过下载字幕…

hdu 3507 Print Article(斜率优化DP)

题目链接&#xff1a;hdu 3507 Print Article 题意&#xff1a; 每个字有一个值&#xff0c;现在让你分成k段打印&#xff0c;每段打印需要消耗的值用那个公式计算&#xff0c;现在让你求最小值 题解&#xff1a; 设dp[i]表示前i个字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服务注册与服务查询

1、定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法。 关于服务的定义&#xff1a;服务的属性我们会在后边每出现一个总结一个&#xff0c;最后再做总结。 2、服务注册 2.1、创建服务文件所存放的文件夹 说明&#xff…

coreos 安装mysql_CoreOS 在 PC 上快速安装方法指南

意义能够以最快的速度安装部署Linux操作系统。安装快速简单&#xff0c;几乎不花时间就可以开始运行Docker。运行速度非常快。使用内存硬盘。我的情况win8 笔记本偶尔玩游戏&#xff0c;但是装Linux双系统可能需要我一天的时间来完成。我的所有业务都只需要在Docker中跑就可以了…

Session 的配置和特性

session的配置 对于session的配置是php.ini中配置 session数据都是保存在文本文件中 设置session文件的保存位置 说明&#xff1a; 默认是保存在windows/temp目录 设置session保存作为客户端标识的数据使用cookie 设置session保存客户端标识的数据&#xff0c;只使用cookie 说明…

OAuth与Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 开放式身份验证 &#xff09;是一种开放式身份验证标准。 它允许用户与其他站点共享存储在一个站点上的私有资源&#xff08;例如照片&#xff0c;视频&#xff0c;联系人列表&#xff09;&#xff0c;而不必发出其凭据&#xff…

UIViewController生命周期

UIViewController生命周期 UIViewController生命周期 posted on 2016-04-07 20:15 相而勿绝 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/fmdxiangdui/p/5365249.html

众筹源码 php,助创cms众筹源码系统v1.0

什么是助创cms众筹系统?使用“预约团购”的众筹方式给自己的创意争取大家的关注和支持&#xff0c;是近年来非常火热的一种融资模式&#xff0c;助创cms众筹系统可以10分钟帮你打造一个和京东众筹一样的平台&#xff0c;包含产品众筹和公益众筹两个部分&#xff0c;可以直接拿…

69 个经典 Spring 面试题和答案

Spring 概述 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发&#xff0c;并通过POJO为基础的编程模型促进良好的编程习惯。使用Spring框架…

高性能MySql

1、索引是对DB优化最有效的方式 varchar(10)定义的是字符的个数&#xff0c;如果是utf-8的话&#xff0c;最大是3X10个字节 二、索引类型 1、MySql的索引是在存储引擎层实现的&#xff0c;各个存储引擎的的索引方式也是不同的 2、B-Tree索引 MyISAM索引通过数据的物理位置引用被…

Java Swing井字游戏

大家好&#xff01; 哇&#xff0c;自从我在这里发布了东西以来已经有一段时间了&#xff01; 我必须说我真的很想写东西&#xff0c;而且我保证我不会再陷入“作家的障碍”。 希望 ..最近两个月发生了很多事情&#xff0c;我有很多话要说。 但是在这篇文章中&#xff0c;我只是…

event php,PHP event 事件机制

/** PHP 事件机制*/class baseClass{private $_e;public function __set($name,$value){if( strncasecmp($name,"on",2) 0 ){if(!isset($this->_e[$name]))$this->_e[$name] array();return array_push($this->_e[$name] , $value);}}public function __g…