Drools 5.1.1_DOC (63)
Drools 5.1.1_DOC_Drools_Guvnor
1.4.3 创建一个业务用户视图
在 多数情况下,并不是所有用户都希望看到在这里描述的所有功能。你可能有一个用户子集,只希望让他们浏览和编辑某些规则集,而不会被其他的东西所迷惑。在这 种情况下,你可以使用细粒度授权(如何初始化它,请看管理员指南章节)。通过在每个分类的基础上设置权限,让只有分类权限的用户才会看见一个受限制的功能 子集,以及仅用这些分类标记的条目。
1.4.4 事实模型(对象模型)
对于任何基于规则的应用程序,都需要一个事实模型来驱动规则。事实模型通常与应用程序的域模型重叠,但是一般来说,它是与它非耦合的(因为这让规则随着时间的推移更易于管理)。
有2种方法来做它:你可以上传jar文件——包含你的应用程序和规则两个都使用的类,或者你可以使用与规则同时声明的模型。
图1.35 选择一个模型类型
当一个jar包被上传时,它会添加import语句到包配置(然后你可以检查和改变它们)。
使用声明模式,你会看见以下这样一个编辑器:
图 1.36 选择一个模型类型
在这里,你可以定义类型,和添加字段(每个字段有一个类型)。字段的类型由一个列表提供建议(但是这个列表不全面):
图1.37 选择一个模型类型
这些事实模型可以像普通的事实对象一样被使用,然而你创建它们的方式是不同的(因为它们并不在你的应用程序类路径上)。要创建这些对象,都可以从规则库( RuleBase )实例创建它们。
// Retrieve the generated fact type
FactType cheeseFact = ruleBase.getFactType( "org.drools.generatedbeans.Cheese" );
// Create a new Fact instance
Object cheese = cheeseFact.newInstance();
cheeseFact.set( cheese,
"type",
"stilton" );
然后,上面的 "cheese"对象就像一个基于pojo的事实一样可以被插入到工作内存。
注意,声明类型的命名空间是包声明的命名空间(在上面情况中是的 "org.drools.generatedbeans")。
为什么你选择利用jar文件声明类型:通常这加强了事实模型“属于”规则库,而不是应用程序,并且允许模型有一个独立于应用程序的生命周期。它还去掉了在规则与使用该规则的应用程序之间维持同步的麻烦。
1.4.5 工作集( Working Sets)
工作集是一种手段,用于分组事实,然后给它们定义约束。你能够创建事实分组,并且在使用指南编辑器创作规则时,只有这些事实才是可见的。
目前,工作集必须从指南编辑器窗口手动激活(使用放置在工具条中的"Select Working Set"按钮)。在将来,不同的工作集能够被分配给不同的用户,以便于在创作规则时减少范围和复杂性。
图1.38 创建一个新的工作集
上 面的图显示了用于创建或修改工作集的窗口。在这窗口中你会找到2个列表。在左边的列表中,包含了可以添加到工作集的事实类型。这些事实是那些定义/导入在 包的模式中的事实。在右边的列表,包含这个工作许可的事实类型。当工作集是活动的时,当使用指南BRL编辑器创作规则时,只有这些事实类型可以被使用。
图 1.39 在一个工作集内部定义字段约束
一旦你为一个工作集选取了有效的事实类型,你可以添加约束到这些事实类型的字段。上面的图显示了字段约束标签看起来像是如何的。在这个配置屏幕,你会发现:
A.——事实类型下拉列表:在这里你会找到包含工作集的事实类型的一个列表。
B.——字段下拉列表:一旦你选取了一个事实类型,这个下拉列表会包含它的字段。
C.——约束列表:这个列表显示应用到所选字段的所有约束。
D.——动作按钮:使用这些按钮,你将能够添加或删除所选字段的约束。目前,Guvnor提供了一个内置约束的集合。下一个版本的想法是也可以让用户插接他们的自定义的约束 。
E.——约束的属性:在这部分,你会找到当前可以被用户参数化的约束的所有属性。
在上面的例子中,为Car.brand字段创建了一个Matches约束。这意味着当规则作者在一个规则条件中使用这个字段时,他们应该根据这个约束使用一个有效的值,否则他们将会收到一个错误或警告。
1.4.5.1 激活和使用工作集
在Guvnor中,默认时工作集没有被激活。因为它是一个试验性的功能,如果你想使用它们,你必须在指南编辑器面板中手动启用它们。在将来,工作集会与每个用户的个人资料相关联。
一个新按钮被添加到了指南编辑器的工具条中:"Select Working Sets"。这个按钮将会打开一个弹出对话框,其带有包的工作集的列表。使用这个弹出对话框架,你可以激活一个或多个工作集。
当工作集被激活,在插入新模式或动作(Patterns or Actions)时,只有它们允许的事实类型才能够被使用。在规则中已经存在的模式和动作,所包含的事实类型被标记为只读。 看一看下面的截屏,比较一下使用工作集和没有使用工作集的指南编辑器。
图1.40 使用工作集和没有使用工作集的"添加新模式(Add new Pattern)"窗口的比较。
在这个图片中,你可以看到工作集如何通过减少可用的事实类型能够帮助规则的作者。
图1.41 使用工作集和没有使用工作集的"添加新模式(Add new Pattern)"窗口的比较。
在这里你可以看到,在工作集被激活以后,包含了禁用的事实类型的模式被切换成了只读模式。
1.4.5.1.1 使用字段约束
到目前为止,我们只介绍了如何使用工作集过滤事实。工作集另外一个重要的功能是字段约束。我们已经看到了如何配置它们,现在打算解释如何使用它们。
因为字段约束被定义在一个工作集中,所以我们需要激活一个或多个工作集,利用它们启动工作。一旦一个定义了字段的约束工作集被激活,我们有种方式使用它们:按需验证和实时验证。
当你按显示在指南编辑器工具条上的"Verify"按钮时,按需验证被执行。这个按钮将引发一条规则的检验,并且最终会显示一个带结果的报告。任何违背约束会根据其相关性作为一个错误或警告被显示。
图1.42 按需字段约束验证
上图所示报告,当工作集定义了一个关于Driver.age的范围约束(Range Constraint )时会出现。年龄应该在18和80之间。
实 时验证是一个实验性的功能(是的,在另外一个实验性功能工作集的内部),及时检查字段的约束违背,并且用一个错误或警告图标标记违背的行。默认时,这个功 能被禁用,因为它可能有时代价太高。如果你想试一试,你应该在Administration -> Rules Verification中启用它。这个配置还没有持久化,所以你需要每次你启动Guvnor时启用它。
图1.43 实时字段约束验证
这个图片显示了实时验证的结果。在那儿,你可看到与按需验证相似的结果,但是你不用点击任何按钮,而且错误/警告以一个更时尚的方式显示!
注意:使用实时验证的问题是目前只支持“顶级”模式。
1.4.6 业务用户透视图
从这个手册你可以看到,使用Guvnor需要一定的专业知识和实践经验。实际上任何软件系统,即使它有一个好看的GUI,在某些情况下也要求人是“技术性”的。话虽如此,恰当地设置Guvnor,能够为非技术用户提供一个合适的环境。
对于这种用户,最合适的规则格式是使用指南编辑器、决策表和DSL规则。你还可以在指南编辑器中使用一些DSL表达式(因此它为人们提供了输入值的“形式”)。
你可以使用分类,让规则和资产与非技术用户隔离。只有指派了一个分类的资产才会出现在“分类”视图中。
Guvnor初始设置,需要由将设置所有规则的基础的开发人员/技术人员来做。他们还可能创建可以被复制的“模板”规则(它们通常存活在一个“dummy(虚拟物)”包中,而且有一个“template(模板)”分类——这样能够有助于缓解手段)。
部署也不应该由非技术人员来做(如前所述,这从"Package"功能产生)。
1.4.7 在一个规则包中的高级配置选项
因 为Drools支持包的各种配置选项 (比如,用于"accumulate(累计)"的函数,等等),这可以通过添加 X.package或X.conf文件给包来实现——文件以 “properties(属性)”样式包含名字/值对。 然后,它们会被自动添加到包配置。你能做的所有事情,请参看主Drools文档。
1.4.8. 部署:集成规则与你的应用程序
管理规则是非常有趣的,但是如何在你的应用程序中使用或”消费“它们呢?这部分介绍知识代理(KnowledgeAgent)部署对你而言大部分是自动化的组件的用法。
1.4.8.1 知识代理
知 识代理是在Drools API中的一个内嵌组件。要使用它,你不需要任何外部组件。实事上,如果你正使用Guvnor,你的应用程序应该只需要包括drools-api和 drools-core依赖关系包在它的类路径上(仅drools和mvel jars),并不需要其他的规则特殊依赖关系包。
注意,还有一个drools-ant的ant任务,所以你完成可以不使用Guvnor,而是作为一个ant脚本的一部分构建规则(例如,在IDE中编辑规则的情况)—— drools-ant 任务会产生与 Guvnor相同的.pkg文件。
一旦在Guvnor中(或从一个ant任务)构建了在一个包中的你的规则,你就可以在你的目标应用程序中使用代理。
下 面的例子构造了一个代理,它将根据在路径字符串中指定的文件构建一个新的知识库。默认时,它会每60秒轮询这些文件以了解它们是否被更新。如果发现了新文 件,它将会构造一个新的知识库。如果更改集(change set)指定了一个资源,是一个目录,也会扫描它的内容变化。
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "MyAgent" );
kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) );
KnowledgeBase kbase = kagent.getKnowledgeBase();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeAgentConfiguration kaconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
kaconf.setProperty("drools.agent.scanDirectories","false" );
//we do not want to scan directories,just files
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "test agent", // the name of the agent
kaconf );
kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) ); // resource to the change-set xml for the resources to add
<change-set xmlns='http://drools.org/drools-5.0/change-set'";
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd' >
<add>
<resource source='http://localhost:9000/TEST.pkg' type='PKG' />
</add>
</change-set>
默认时,资源扫描没有打开,它是一个服务,必须被启动,与通知(notification)是相同的。可以通过 ResourceFactory来完成。
ResourceFactory.getResourceChangeNotifierService().start(); ResourceFactory.getResourceChangeScannerService().start();
以下所示为Guvnor的部署屏幕,它提供URLs和包的下载。
图 1.44 快照部署
你还能够从这里下载一个.pkg文件, 你可以把它投入到一个目录中,如果需要,使用KnowledgeAgent的"file"或"dir"功能 (有些时候,人们不愿意在运行时自动与Guvnor通讯升级——但是对于多数人,它通常是最容易的方法)。
还可以通过 WebDAV访问仓库后端。 WebDAV是一个基于http的文件系统API——在所有平台上都有客户端(某些操作系统,例如windows能够直接连接 WebDAV)。仓库就像是一个文件系统。
1.4.9.1 WebDAV
图 1.45 Windows webdav
在 windows中,可以使用"web folders"功能。在OSX上—— 免费的cyberduck客户端能很好工作。 要用webdav访问仓库,你的url与网页界面是一样的,只是在最后使用/webdav,而不是Guvnor.html。这种方式进行访问可能需要身份 认证。它会显示包和快照目录——快照目录是只读的(一个包创建的快照视图)。包目录会包含在仓库中的包列表,深入它们会以文件方式显示单独的资产。
1.4.9.2 URLs
有 一些便于了解存在的其他的URLs。在知识代理部署章节提及的包部署URL还有一些其他的功能:通过添加.drl 在一个url的最后,你会显示那个包产生的DRL,例如:/package/testPDSGetPackage/LATEST.drl ——会显示最新包的DRL(不是二进制包)。此外,你可以添加 /assetName.drl ——那么它会显示该条目产生的DRL(即使它不是一个drl文件)。例如 /package/testPDSGetPackage/LATEST/SomeFile.drl.
1.4.10 收件箱和注释
为帮助管理变化,Guvnor内置了两个有用的功能:Inbox(收件箱)和comments(注释)部分。这些功能不会影响到任何执行或访问规则,但是纯粹是为了文档化和告之目的,当然都是可选使用的。
1.4.10.1 注释
每个构件下面的文档框,都有一个 "comments"部分——简单地说,你可以添加一个新注释。管理员能够清除给定构件上的所有注释 ,而其他用户只能添加注释。每条注释记录了用户什么时候,做了什么注释。不能编辑构件的用户仍可以给它加注释。
1.4.10.2 收件箱
该 应用程序的“浏览”部分,有一个"Inbox"树条目,其下面有3个收件箱。"Incoming changes"包含以往任何当前注册用户编辑或注释过的有变化的构件。 编辑或注释一个构件只不过记录了关注,在下一次你登录时被告之变化。"Recently opened"包含最近被打开过的条目(打开一个构件只是会让它在这里显示,会显示最近100个条目)。"Recently edited"包含最新编辑过的100个条目(当前用户做了更改的构件)。
1.4.11 Eclipse Guvnor 集成
Eclipse Guvnor tools (EGT) 提供从Guvnor仓库服务器和在eclipse中的开发者工作区推/拉构件的能力。因此,是能够通过Guvnor,以及在传统开发者友好 SCM( Source Code Management )系统中(比如,subversion)管理构件。Guvnor仓库的设计目的不是作为一个源代码管理(SCM)解决方案,并且 EGT的设计目的也不是作为 Eclipse“团队提供者”扩展或替代物。 恰恰相反,Guvnor仓库是一个场所, 是由部署环境所定义的策略控制(“管理”)某些构件(比如,规则和SOA策略的定义)的地方。EGT的目的则是允许访问由Guvnor仓库维持的资源,所 以,它们可以被用于部署中。因此,在EGT中提供了读、写、增加、删除Guvnor仓库资源的有限能力。
1.4.11.1 源代码和插件细节
EGT 的源代码在:http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools- eclipse/ EGT可用,构成了两个插件:org.guvnor.tools和org.eclipse.webdav,并且要求Eclipse 3.3.x。 当前的Eclipse Drools插件对于浏览Guvnor仓库资源,比如规则定义,也是非常有用的,但是不需要EGT的操作。
1.4.11.2 功能概述
视 图和透视图:EGT包含两个视图——Repository Explorer(仓库资源管理器)和Version History(版本历史)—— 它们几乎是与Guvnor交互的中心。Eclipse的标准视图,比如属性(Properties)和资源导航员( Resource Navigator)也是非常有用的。 虽然每个这些视图都可以打开,并且都独立定位在 Eclipse工作台中,而Guvnor透视图提供了一个更方便的的方法,获得一个建议布局。在 Eclipse工作台菜单中,选取 Window-> Open Perspective->Other,得到透视图列表:
图1.46 视图和透视图
然后选择 “Guvnor Repository Exploring.” ,这会打开Guvnor透视图:
图1.47 视图和透视图
在
左边是Guvnor Repository Explorer和Eclipse Properties视图 ,Guvnor Resource
History视图在底部,Eclipse Resource Navigator是在右边。Guvnor Repository
Explorer的目的是允许以标准树格式访问Guvnor仓库资源 ,而Guvnor Resource
History视图显示在该仓库中可用的特定资源的修订版本集。
1.4.11.3 Guvnor连接向导
在打开Guvnor透视图后,首要任务是做一个到Guvnor仓库的连接。这由Guvnor 连接向导处理 。这个向导出现在EGT内的一些地方(后面详述),但是本节我们将只介绍两个最基本的入口点。可以使用Eclipse菜单启动Guvnor连接向导:File-> New-> Other-> Guvnor-> Guvnor repository location,或者在Guvnor Explorer中使用下拉菜单:
图1.48 连接向导
图1.49 连接向导
选择其中之一将启动Guvnor连接向导:
图1.50 连接向导
默 认值出现在Location、 Port、和Repository字段中(有关如何改变这些默认值的详情,请看后面的“Guvnor参数设置”章节)。当然,通过在相应的文本框中输入, 能够编辑这些字段中的任何一个。 拖放或粘贴一个典型的Guvnor仓库URL,如:http://localhost:8080/drools-guvnor /org.drools.guvnor.Guvnor/webdav 到Location字段 ,同样导致URL被解析成相应的字段。根据"Save user name and password."的选择,身份认证信息(用户名和密码)可以选择性地被存储在Eclipse工作台的key-ring文件中。如果认证信息没有存储在 key-ring文件中,那么EGT使用会话认证,这意味着提供的证书只被用于Eclipse工作台实例的生命周期中。
如果认证信息没有被存储在key-ring文件中,或者认证信息(key-ring或会话)是无效的,当访问Guvnor仓库时,EGT将提示输入认证信息 :
图1.51 登录
如果认证失败,EGT会重试一次,然后发出一个认证失败错误(如果一个认证失败错误发生,你能够重试相同的操作,并提供不同的认证信息)。注意, EGT在不同的时间调用Guvnor仓库,例如,在决定资源升级是否可用,等等,如果你使用会话认证,在Eclipse工作台会话期间,认证对话框会在不同的时间出现,取决于你采取的动作。为了便于使用,我们推荐保存认证信息在 Eclipse key-ring文件中(Eclipse key-ring文件是完全不同于在某些平台所找到的key-ring文件,如Mac OS X 和许多Linux形式。因此,如果有时你在EGT之外访问 Guvnor仓库,key-ring文件可能变得不同步,并且在Eclispe中会被意外地提示输入认证。 这是麻烦事,但是在这种情况下,你应该应用通常的证书)。
一旦Guvnor连接向导完成,新Guvnor仓库连接会出现在Guvnor仓库资源管理器中。你能够展开树,浏览Guvnor仓库的内容。
1.4.11.4 Guvnor仓库资源管理器
图1.52 资源管理器
图1.53 资源管理器
那样,我们只看见在该树中的“defaultPackage” 内容。点击房子按钮或选取“Go Home” 返回树到顶层结构,显示上面先前的图片。
图1.54 属性
图1.55 注释
从Guvnor仓库树拖动一个文件到在Eclipse本地项目的一个文件夹(例如,在Eclipse Resource Navigator视图中)会导致那个文件被复制到本地Eclipse工作区。(注意:当一个文件在只读编辑器中被打开时,你还可以“Save As...”,保存一个本地可编写的内容拷贝)。然而,这样做,创建的文件将不再与Guvnor源相关联)。最后,使用“Show History” 上下文菜单项,你可以浏览在树中所选择文件的修订历史。(资源历史细节会在后面讨论。)
1.4.11.5 Guvnor文件的本地备份
如介绍所提及的,EGT的主要目的是允许使用维持在一个Guvnor仓库中的资源的部署。有两种方法获得Guvnor仓库资源的备份:
1. 如上所述,从Guvnor Repository Explorer拖放。
2. 如下所述,使用“import from Guvnor”向导。
当 Guvnor仓库的本地备份被创建,EGT在本地备份和在仓库中的主文件这间设置了一个关联。(这个信息(通常)被保存在本地项目的一个隐藏文件夹 “.guvnorinfo”中,像所有元数据一样,应该不能被终端用户改变)。这个关系允许诸如用维持在Guvnor仓库中的主备份更新和同步提交等操作 。EGT装饰本地资源与Guvnor仓库的主备份相关联。这个装饰出现在符合Eclipse通用导航器框架的Eclipse视图中,例如 Eclipse Resource NavigatorJava Package Explorer。下图显示了在 Eclipse Resource Navigator中的装饰:
图1.56 导航器
图1.57 属性
EGT增加了一个属性页面给标准的Eclipse属性对话框,内容如上所示。 properties dialog, the contents of which are shown above. 显示了特定的Guvnor仓库、在仓库内的位置、版本(日期/时间邮戳)和修订版本号。
1.4.11.6. 用于本地Guvnor资源的动作
更 新动作可用于一个或多个没有与Guvnor仓库的主备份同步的Guvnor资源。 这些资源没有在同步状态,因为两个原因:(1) 对这些资源做了本地改变,或(2)在Guvnor仓库中的主备份已经改变 。执行更新动作用Guvnor仓库的主备份的当前内容替换本地文件内容(等价于“切换版本(Switch to version)” 为最新版本)。
Add Action
添加动作可用于一个或多个没有与Guvnor仓库的主备份关联的本地文件。选择Add action启动“添加到Guvnor”向导:
图1.58. Add action
向导的首页询问目标Guvnor仓库的选择,并且给出机会创建一个新的Guvnor仓库连接(在这种情况下,第二页是与上述的Guvnor连接向导相同)。一旦选择了目标Guvnor仓库,向导然后询问用于添加选择的文件的文件夹位置:
图1.59 Add action
Compare with Version Action:
比较版本动作是用于一个Guvnor仓库关联的文件。这个动作首先打开一个向导,询问比较的版本(与本地文件内容):
图1.60 Compare
图1.61 Compare
Switch to Version Action:
切换到版本动作是用于一个Guvnor分仓库关联的文件。首先,切换到版本动作提示选择版本:
图1.62. Versions
Delete Action:
删除动作是用于一个或多个Guvnor仓库关联的文件。通过一个对话框确认后,删除动作删除在Guvnor仓库中的文件,并且删除用于Guvnor仓库关联的本地元数据。
Disconnect Action:
撤销连接动作是用于一个或多个Guvnor仓库关联的文件,并且删除用于Guvnor仓库关联的本地元数据。
Guvnor Resource History View:
Guvnor资源历史视图应该详述所选文件的修订本历史,本地的和在Guvnor仓库中的。这个视图的初始化状态是:
图1.63 History
图1.64 History
除了从Guvnor仓库资源管理器拖放单独文件外,EGT还包括一个向导,用于从一个Guvnor仓库复制一个或多个文件到本地工作区(并且设置与Guvnor仓库的关联)。启用这 个向导可以从Eclipse Import -> Guvnor-> Resource from Guvnor ,和Eclipse File->New-> Other-> Guvnor-> Resource from Guvnor菜单项。(注意:向导是雷同的,但是出现在两个地方,为迎合易于观察这个功能的用户,而作为是在两个分类中)。向导的首页询问源Guvnor仓库的选择,并且给出了机会创建一个新的Guvnor仓库连接(在这种情况下,第二页是与上述的Guvnor连接向导相同)。
Figure 1.65. Import
图1.66 Import
最后,在本地工作区中选择目标位置:
图1.67 Import
当完成时,向导从Guvnor仓库复制所选文件到本地工作区。如果一个文件与在目标中的有相同的名字,向导使用Eclipse标准的“prompt for rename” 对话框:
图1.68 Copy
1.4.11.8 Guvnor插件参数设置
EGT在“Guvnor”分类中提供了一个参数设置页面:
图1.69 Preferences
参数设置包含两个分类:Guvnor repository connections和local Guvnor repository resource decorations.
Guvnor Repository Connection参数
有
两个参数可以设置Guvnor仓库连接,并且在创建新连接时,使用它们。第一个是一个默认的Guvnor仓库URL模板,它通过简单地改变字段部分让创建
多个类似的连接变得容易,例如主机名。第二个是是否保存认证信息在Eclipse平台的key-ring中,默认是启用的。因为使用 Guvnor仓库URL模板,在实际创建连接时,可以决定是否真的要保存一个特定的认证信息实例在Eclipse平台key-ring中。即这两个参数只是设置为合理默认值的方便值。
Local Guvnor Repository Resource Decoration参数
EGT提供的参数设置的第二个分类处理与Guvnor仓库资源关联的本地资源的装饰如何显示。 因为Guvnor仓库并不是一个SCM的一个替代物,并且在 Eclipse中的SCM工具倾向于装饰本地资源,所以,能够控制EGT如何只装饰它的本地资源避免与SCM包的混乱冲突是非常有用的。在 参数设置页面的“File Decoration”部分,你可以选择装饰的位置(top right, bottom right, top left, bottom left),或者你可以选择不显示它。 “Text” 部分中,你可以格式化追加到文件名字的Guvnor元数据:在本地文件已经改变,但没有提交回Guvnor仓库时, 是否显示一个指针(>)。是否显示修订本号。是否显示日期/时间邮戳。点击 “Apply”或 “Ok” 按钮,这些参数设置的任何改变会立即生效。

浙公网安备 33010602011771号