Drools 5.1.1_DOC (62)

Drools 5.1.1_DOC_Drools_Guvnor

1.4  快速入门指南


1.4.1  快速入门指南


如果你正在阅读此文,你一定是一个急躁类型人,走马观花地看看。 本节将提供一个所涉步骤的快速端对端的巡视(但是不涉及概念细节)。这假定你已经正确地安装仓库,并且能够访问主注册屏幕。


为了得到一些教程和用户技巧,你也可以参考wiki: http://wiki.jboss.org/wiki/Wiki.jsp?page=RulesRepository (它是一个维基,所以你甚至能够贡献你自己的技巧和例子,如果你愿意,甚至可以上传文件)。


Main feature areas of Guvnor

图 1.7  Guvnor的主要功能区。


上面的图片显示了Guvnor的主要功能区。

  • Info:  这是初始化屏幕,带有到资源的链接。
  • Rules:  这是分类和业务用户的透视。
  • Package:  这是配置和管理包的地方。
  • Deployment:  这是管理部署快照的地方。
  • Admin:  管理功能(分类、状态、导入和导出)。

1.4.1.1   支持的浏览器平台

支 持的服务器边平台在安装指南中被提及。对于浏览器——主要支持的有,Firefox (1.5以上), IE7以下,Opera, Safari, Google Chrome等等。对于大多数平台,首选的是firefox,它被广泛使用,且是免费的,如果你要做选择,Firefox是首选平台,其次在mac平台上为safari。IE6 用户可能会体验到一些较差的性能,因为它是一个危险、不安全的浏览,建议用IE7 或更优的浏览器(如,Google Chrome, Firefox, Safari)。
 
1.4.1.2  BRMS 或 Guvnor?
 
在Drools的早期版本中, "BRMS" 常被用来指Drools管理功能的网页界面。如今我们用BRMS指“整个包”——运行时、网页工具等等——但是在某些情况下,你也可以把"BRMS"理解为Guvnor网页控制台和关联的工具的意思。

1.4.1.3  初始配置 

第一次需要一些初始设置。首次启动服务器时,它会创建一个空的仓库,然后采取以下步骤:
 
  •  一旦部署,到"http://<your server>/drools-guvnor/" (其会显示初始的info屏幕——或者注册屏幕,取决于配置)。
  • 如果它是一个全新的仓库,你会想到"Admin",并选择"Manage Categories" (添加一些你选择的分类,分类只是用于分类,不是为了执行,或其他的事情)。
  • 工作规则需要一个事实模型(对象模型)用于脱机工作,所以接下来,你会想要到包管理功能(Package management feature)。从这儿,你可以点击图标创建一个新的包(给它一个有意义的名字,不要有空格)。
  • 要上传一个模型,使用一个拥有你将在你的规则和代码中使用的事实模型(API)的jar包(如果需要,去做一个新的!)当你在模型编辑器屏幕(model editor)时,你可以上传一个jar包文件,从列表中选取在上一步创建的包名。
  • 现在编辑你的包配置(你刚创建的),导入你刚上传的事实类型(增加import语句),然后保存改变。
  • 此刻,包被配置,准备好了(你一般不必经常通过那个步骤)。
(注意,你也可以导入一个现有的drl包——它将作为单独的资产存储规则在仓库中)

1.4.1.4    编写一些规则 


  • 一旦你至少设置一个分类和一个包 。你可以创作规则了。
  • 有多种规则“格式”,但是从BRMS的角度来看,它们都是“资产”。
  • 通过点击具有规则徽标的图标(头部),你创建一条规则,并且从那儿输入一个名字。
  • 你还必须选择一个分类。分类提供浏览与包分离的规则的一个方法(你可以让规则显示在多个包中)——把它看作标记。
  • 选择"Business rule (guided editor)"格式。
  • 这会打开一个规则建模器,它是一个指南式编辑器。你能够根据在当前包中使用的模型添加和编辑条件和动作。为该包设置的任何DSL语句模板将是可用的。 
  • 当你正在做使用规则编辑时,你可以登记变化(保存),或者可以验证或“浏览源代码”(对有效的源代码)。
  • 你也可以从规则编辑器添加/删除分类,以及其他的属性,如文档(如果你不确定做什么,用自然语言编写一个描述规则的文档,并登记它,也可以把它作为以后的一个模板)。
1.4.1.5   查找东西

在导航方面,你能够使用规则功能(Rules feature),显示分类分组的东西,或者你能够使用包功能,通过包浏览(和规则类型)。如果你知道一个资产的名字或部分名字,你还能够使用
 "Quick find",开始输入一条规则的名字,它将返回与你的输入相匹配的一个列表(所以,如果你有一个合理的命名方案,查找东西就会非常快)。

1.4.1.6  部署

  • 在你编辑了一个包中的一些规则后,你可以点击包功能(package feature),打开你希望的包,并构建整个包。
  • 如果成功,则你将能够下载一个二进制包文件,可以把它部署到一个运行时系统中。
  • 你 也可以获得一个用于部署的一个包的“快照”。这及时在此点冻结了该包,所以任何并发变化不会影响该包。它还使该包能够以一个 "http://<your server>/drools-guvnor/org.drools.guvnor.Guvnor/packages/<packageName>/<snapshotName>" 格式的URL可用。(你能够使用那个URL和下载的地方,会被用在部署时的部件覆盖。)

1.4.2   BRMS 概念

1.4.2.1  规则是资产

因为BRMS能够管理不同类型的规则(甚至更多),它们都被归类为“资产”。一个资产是能够作为一个版本被存储在仓库中的任何东西。这包括决定表、模型(
models)、DSLs,以及更多。有时候,单词“规则”的真正意思习惯指“资产“(即,你能够做的事情也适用其他资产类型)。你可以把资产看作象一个文件夹中的许多文件。为了浏览,资产被分组在一起,或者为了部署,做成一个包,等等。

1.4.2.2   分类
Categories
图1.8   分类

分 类允许规则(资产)用你定义的任意数量的分类标记。这意味着,你可以浏览匹配一条特殊分类的一个规则列表。规则可以属于任意数量的分类。在上面的示图中, 你可以看见,实际上这能够创建像资产视图一样的一个文件夹/资源管理器。名字可以是任何你想要的,并由BRMS管理员定义(你也可以删除/添加新的分类 ——如果你目前没有使用它们,你可以只删除它们)。

通常用
有意义的名字创建分类,其匹配该规则应用到的业务领域(如果该规则应用到多个领域,则可以连接到多个分类)。分类还可以用来“标记”规则作为它们生命周期的一部分,例如,标记为"草稿" 或 "用于审查".
Assets can have multiple categories
图1.9  资产可以有多个分类

当你打开一个资产时,上面的视图显示所见的分类编辑器/浏览器。在这个例子中,你可以看见资产属于2两个分类,用一个"+"按钮添加其他的条目(使用垃圾桶可以删除它们)。这意味着当任何一个分类被用来显示一个资产列表时,你会看见这个资产。
在 上面的例子中,第一个分类"Finance"是顶层分类。第二个分类"HR/Awards/QAS" 仍然是一个单个分类,但是它是一个嵌套分类。分类是层级的。这意味着有一个分类叫"HR",它包含一个分类"Awards"(当然,事实上它有更多的子分 类),而"Awards" 有一个QAS子分类。 屏幕显示为"HR/Awards/QAS"——它是非常像在你的硬盘上有的一个文件夹结构(当然,值得注意的例外是规则可能出现在多个地方)。

当你打开一个资产浏览或编辑时,它会显示它目前所属分类的一个列表,如果你做了一个改变(删除或增加了一个分类),你将需要保存该资产——这会
在版本历史中创建一个新条目。一条规则的分类的改变,不影响它的执行。

Creating categories

图1.10  创建分类


上面的视图显示了管理屏幕,用于设置默认时在系统中没有分类的分类。因为分类能够被分层,所以你选取用于你想创建一个子分类的"父"分类 在这儿,分类也可以被删除(但是只在它们没有被任何当前版本的资产使用时才可)。


作为一个普通原则,一个资产在同一时间应该只属于1或2个分类。 分类的关键是在于你有大量规则的情况时。分层不必太深,但是应该能够了解到它如何能帮助你把规则/资产分解为可管理的块。如果在第一次是不清楚,那么好了,现在你可以随意地改变分类了。



1.4.2.3  资产编辑器

 
The Asset editor view

图1.11  资产编辑器视图

上面的示图显示了带有一些注释区的“资产编辑器”。资产编辑器是所有规则做改变的地方。下面是一个列表,描述该编辑器的不同部分。


A    这是编辑器“部件”存活的地方——编辑器采用的精确形式,取决于资产或规则的类型。
B    这是文档区——一个自由文本区,该规则的描述能够存活的地方。鼓励在编辑该规则前写一个简单的描述。
C    这些是动作——用于保存、归档、更改状态等等。归档等价于删除一个资产。
D    这儿有资产的名字,以及资产属于的分类列表。
E    这部分包含只读元数据,包括什么时候做了改变,由谁做的。"Modified on:" ——最新修改的日期。"By:" ——谁最后做的改变。"Note:"——当该资产最后更新时,所做的注解(即,为什么做改变)。"Version:" ——-这是一个数字,每一次改变被检查(保存)时,增加1。"Created on:" ——该资产创建的日期和时间。"Created by:" ——资产的最初作者。"Format:" ——资产类型的短格式名字。
F    这显示该资产属于什么包(在这儿,你也可以改变它)。
G    这是一些其他的元数据选项(取自柏林核心元数据标准)。
H    这将显示在请求时的版本历史列表。


1.4.2.4   规则创作

 BRMS支持一个越来越的资产(规则)格式的列表 。在这里描述重要的一个。其中的一些的在手册的其他部分介绍,并且这里的细节不会重复。


1.4.2.4.1  业务规则与指南编辑器


指南编辑器使用 "业务规则"样式:(也被称为"BRL格式")。 这些规则使用指南式GUI,控制和提示用户根据对象模型的知识输入。还可以使用DSL语句增加它。


重要:使用BRL指南编辑器,一些人需要你事先配置你的包。


还要注意,在Eclipse插件中有一个指南编辑器,在本节中的大部分细节也适用于它。

The guided BRL editor

图1.12  指南BRL编辑器


上面的示图显示了在行动中的该编辑器。以下描述适用于上面示图中的字母框:


A   一条规则的不同部分。"WHEN" 部分是条件,"THEN"动作, 而 "(options)"是可能影响该规则的操作的可选属性 。
B   其显示了一个模式,正在声明该规则正在查找一个"Driver"事实 fact (字段列在下面,在这里只有"age")。点击事实名字(Driver)会弹出选项列表,用于添加到事实声明:你可以添加多个字段(例如他们 的 "location"),或者你可以分配一个变量名给该事实(如果需要,你以后可能使用它)。以及添加更多字段给这个模式——你可以添加“多字段”约 束——即约束跨字段(例如age > 42 or risk > 2)。
C  小三角指示你可以删除某物。在这里,它将删除整个Driver事实声明。如果是下面那个,则只会删除age的约束。
D   "+"号允许你添加更多的模式(patterns)给规则的条件或动作部分,或者添加更多属性.所有这些情况下,都会提供一个弹出选项。对规则的"WHEN"部分,你可以从一个规则的列表中选择添加:


  • "A Constraint on a Fact":它会给你一个事实列表。
  • "The following does not exist":事实+约束一定不存在。 
  • "The following exists": 至少存在有一个匹配(但是只需要一个——它不会触发每一个匹配)。
  • "Any of the following are true":模式的任何一个都能够匹配(然后,你添加模式到这些更高级的模式)。
  • "From":这会插入一个新的From条件元素到该规则。
  • "From Accumulate": 这会插入一个新的Accumulate条件元素到该规则。
  • "From Collect":这会插入一个新的Collect条规元素到该规则。
  • "Free Form DRL":这会让你插入一个DRL自由块。
如果你只放置了一个事实(如上所示一样),那么所有模式被结合在一起,所以它们全为true("and")  。

E:   其显示 "age"字段的约束。从左到右看,你会发现:

  • 字段名: 点击它,你可以分配一个变量名字给它,或访问它的嵌套属性。
  • 一个约束操作的列表:这个列表的内容变化,取决于字段的数据类型。
  • 值字段:它可能是一个
    • 字面值:根据字段数据类型,不同的组件会被显示:String 或Number ->文本框,Date -> 日历,Enumeration ->复选框,Boolean -> 单选框
    •  一个"formula":这是一个被计算的(只是为高级用户准备的)表达式。
    • 一个表达式——其让你使用一个表达式构建器来构建一个纯mvel表达式。(现在,只支持基本表达式)

F:   这显示一条规则的“动作”,规则的RHS由一个动作列表构成。在这里,我们正断言/插入一个新的事实,其为一个 Rejection(带有设置解释的"reason"字段)。你可以使用相当多的其他动作类型: 你可以修改一个现有的事实(通知引擎该事实更改了)——或者你可以只设置一个事实的一个字段(在这种情况下,引擎并不知道有关的变化——因为通常你设置一 个结果)。你还可以收回一个事实。在多数情况下,就如在事实类型(
Fact Types)中一样,点击事实名字会得到一个属性列表,或绑定它到一个变量名字。你输入的值为“字面字符”——在这种情况下,你的类型是什么,则值是什么。如果需要一个计算,那么添加一个"=" 在该值的开头——这会被解释为一个“公式”(只对高级用户)!并且计算会被执行(并不象一个电子表格)。你还能够执行一个事实的逻辑插入,添加事实到现有的全局列表,就一个变量调用一个方法,或写一些自由格式的代码块。

G:   这是规则选项存活的地主。在这里,只使用了salience,该数值代表规则的“优先权”。这可以能是使用得最普通的选项。

H:    模式/动作( Pattern/Action)工具条。紧挨着每个模式或动作,你会发现一个包含3个按钮的工具条。第一个按钮让你在你选择的下面插入一个新模式/动作, 其他两个按钮用于你上下移动当前的模式/动作。默认时工具条是半透明的;当你移动鼠标的光称到其中之一时,会激活它们。


1.4.2.4.1.1  用户驱动的下拉列表


Data enumeration showing as a drop down list

图 1.13   用一个下拉列表显示数据枚举

 
注 意,能够限制在一个预先配置的列表中的条目的字段值。这个列表作为该包的一部分被配置(使用一个数据枚举为下拉列表提供值)。这些值可以是一个固定列表, 或(例如)从一个数据库加载。对于代码和其他需要设置值的字段是非常有用的。让显示在屏幕上的一个下拉列表中的值不同于在一条规则中使用的值(或代码)也 是可能的。如何配置数据枚举请参看有关数据枚举的章节。

1.4.2.4.1.2   用DSL语句扩充
 
如 果该包的规则部分有一个DSL配置,当你添加条件或动作时,那么它会提供用于选取的"DSL Sentences"的一个列表——当你选取一个时,它会添加一行到该规则—— DSL指定的值来自于用户,那么一个编辑框(文本)会被显示(所以,它最终看起来有点像一个表单)。它是可选的,并且有另一个DSL编辑器。请注意,在这 个编辑器中,DSL 的潜在能力逊于全套的DSL功能(你基本上只做DSL的[when]和[then]部分—— 与Drools 3效果一样)。
 
下面的示图,在指南编辑器中,显示了在动作部分中的DSL语句:
DSL in guided editor

图 1.14   在指南编辑器中的DSL


1.4.2.4.1.3  一个更复杂的例子:
A more complex BRL example

图 1.15   一个更复杂的例子


在上面的例子中,你可以看到如何使用条件元素、字面字符值和公式的的混合体。该规则有4个“顶级”模式和一个动作。“顶级”模式为:

  1. 一 个关于Person的事实模式。这个模式包含两个字段约束:一个用于生日字段,另一个是一个公式。注意,生日限制的值从一个日历中选择。另外还要注意,你 可以做计算,并且在公式约束中使用嵌套(即,car.brand)。最后,我们设置了一个变量名字($p) 给Person事实类型。然后,你可以在其他模式中使用这个变量。

    注意

    从这个模式产生的DRL将是:$p : Person( birthDate < "19-Dec-1982" , eval( car.brand == "Ford" && salary > (2500 * 4.1) ))

  2. 一个 From模式。这个条件会创建一个匹配 ,用于匹配来自Person的地址列表中的每个Address的street名字为"Elm St."的。From的左边是一个标准的事实模式,而右边是一个表达式构建器,让我们检查变量的字段。

    注意

    从这个模式产生的DRL将是:Address( street == "Elm St." ) from $p.addresses

  3. 一个 "Not Exist"条件元素。 当它的内容没有创建一个匹配时,这个条件才匹配。在这里,它的内容是一个标准的事实模式(Person)。在这个事实模式中,你可以看到变量($p)如何被用于一个公式值的内部。

    注意

    从这个模式产生的DRL将是:not Person( salary == ( $p.salary * 2 ) )

  4. 一 个 "From Accumulate"条件元素。这可能是你使用的最复杂的模式之一。它由一个左边模式(必须是一个事实模式。在这里是一个 Number模式。该 Number被命名为 $totalAddresses),一个源模式(可以是事实模式、 From、Collect 或Accumulate条件元素。在这里是一个Address模式限制 ,其用它的邮编字段进行限制)和一个公式部分(你可以使用任何内置或自定义累积函数。在这个例子中,使用了count()函数)构成。总的来说,这个条件 元素会统计来自于 Person的地址列表的,且的邮编代码为43240的地址个数。

    注意

    从这个模式产生的DRL将是:$totalAddresses : Number() from accumulate ($a : Address( zipCode == " 43240") from $p.addresses, count($a)) 

Adding Patterns

图 1.16 添加模式

 

当 点击WHEN部分的+按钮时,会显示一个新弹出对话框,让你添加新的模式到该规则。 弹出的看起来类似于上面的图片。在这个弹出对话框中,你可以通过点击列表条目之一,选择添加模式类型。在这个列表中,除了已经提及的条件元素, 如,"exists", "doesn't exist", "from","collect","accumulate"和"free form DRL",你将有每个定义的事实类型的条目。一旦你选择了一个元素,你点击"Ok"按钮可以添加一个新的模式。新的模式会被添加到该规则的左手边的底部。 如果你希望选取一个不同的位置,你可以使用放置在弹出对话框顶部的组合框。

 

你还可以点击一个模式的动作工具条中的+按钮打开这个弹出对话框。如果是这种情况,显示的弹出对话框没有位置(

position

)组合框,因为新模式只会添加到你点击的模式的后面。
Adding constraints

图 1.17   添加约束


 当你想添加约束到Person事实时,上面的对话框是你得到东西的地方。在上半部是简单的选项:你可以马上添加一个字段约束(
 Person事实的一个字段列表会被显示),或者你可以使用AND或OR运算符添加一个“多字段约束”。在窗口的下半部,你有高级选项:你可以添加一个公式(它解析为True或False——如上面的例子:"... salary > (2500 * 4.1)")。你还可以分配一个变量名字给Person事实(这意味着,你以后在规则的动作部分可以访问那个变量,设置一个值,等等)。

 

1.4.2.4.2  DSL规则

 
DSL规则是纯文本规则,其使用了一个语言配置资产来控制它们的显示。
DSL rule

图1.18  DSL规则


DSL规则是单个规则。参阅上面的图片,你可以看到一个文本编辑器。你能够使用右边的图标,提供用于选择的条件和动作的列表(或者同时按Control + Space,弹出一个列表)。

 

1.4.2.4.3   电子表格决策表 

 
多条规则可以存储在一个电子表格中(每行一条规则)。在本节中没有介绍电子表格的细节(因为它们单独有一章)。
Spreadsheet decision table

图 1.19  电子表格决决策表


要使用一个电子表格,你上传一个xls(你也可以下载当前版本,如上图所示)。要创建一个新的决策表,在你启动规则向导时,你会得到一个创建它的选项(在此之后,你可以上传xls文件)。

1.4.2.4.4  指南决策表(基于网页)

指南决策表功能允许决策表在网页上被编辑。其类似于指南编辑器,通过内省可用的事实和字段,指导一个决策表的创建。
Decision table

图 1.20  决策表


在右上角有一个按钮,用于显示指南决策表的配置区域:

Decision table config

图 1.21 决策表的配置


在这个屏幕中,条件和动作列被配置。“属性列”是用于每规则(行)的方式设置属性,例如,salience优先级。基于网页的决策表像其他的规则资产一样被编译到DRL内。

 

列 配置:当你编辑或创建一个新列时,你将会选择约束的类型:字面字符(在单元格中的值将使用运算符与该字段比较)、公式(在这个情况下,在单元格中的表达式 会被求值,然后再与该字段比较)、谓词(这意味着,不需要字段,表达式会被求值为 true 或false)。你可以设置一个默认值,但是如果在单元格中没有值,通常不会应用约束。

 

"in"运算符: 当你选取该运算符时,表明“是在随后的列表中”,那么该单元格值可以是一个逗号分隔的值列表,只要它们其中一个匹配指定的字段,约束会被视为true.

通常,存在有小的"info" 图标(带有字母 "i"),如果你点击它, 会在上下文中提供该功能的弹出式描述。
 

1.4.2.4.5  规则流
 
规则流:规则流允许你直观地描述所采取的步骤——所以并非所有的规则被马上计算,而是有一个逻辑流。在BRMS的这个章节中没有覆盖规则流,但是你可以使用IDE,用图形绘制规则流,并上传.rfm文件到BRMS。
 
类似于电子表格,你可以上传/下载规则流文件(Eclipse IDE有一个用于它的图形编辑器)。在这儿,没有讨论规则流的细节。
 
1.4.2.4.6   技术规则 (drl)

技 术 (drl) 规则以文本方式被存储——能够在BRMS中管理它们。一个DRL可能是整个规则块,或者是单个规则。如果它是单个规则, package 语句或imports语句是不需要的(实事上,你能够完全跳过"rule"语句,只使用"when"和"then"分别标记条件和动作部分 )。通常,你 可能会使用IDE编辑原始DRL文件,因为它有高级工具、内容助手和调试。然而 ,当在Guvnor中,在一个包中的一条规则必须多次处理技术性很强东西时,你通常需要一些“技术规则”——当然,你能够混合和匹配所有规则类型在一起。
DRL technical rule

图 1.22   DRL技术规则

 

1.4.2.4.7   函数

 
函数是另外一种资产类型。它们不是规则,当需要时才应被使用。函数编辑器是一个纯文件编辑器。函数
Function

图 1.23  函数


1.4.2.4.8  数据枚举(下接列表配置)

 

数据枚举是一个可选资产类型, 技术人员能够配置来为指南编辑器提供下拉列表。它们就像任何其他的资产一样被存储和被编辑,并应用到它们属于的包。

 

一 个枚举配置的内容是一个事实.字段(Fact.field)到一个被用于一个下拉列表中的值列表的映射。那个列表可以是字面字符,或者使用一个实用类(你 设置它在类路径上)加载一个字符串列表。字符串是在一个下拉列表中被显示的一个值,或者来自代码值的一个映射(最终被用于该规则中),以及一个显示值(看 下面的例子,使用 '=')。
Data enumeration

图 1.24  数据枚举


在上面的示图中上——"MM"表明一个值会被用于该规则中, 然而"Mini Mal"会被显示在GUI中。


从外部数据源得到数据列表:让BRMS调用将加载一个字符串列表的一段代码是可能的。要做它,你需要一些代码,返回java.util.List(字符串的)到BRMS的类路径。而不是在BRMS自身中指定一个值列表——该代码能够返回字符串列表(如果你想用不同的显示的值为该规则的值,如通常一样,你能够在字符串内使用"=" )。例如,在上面的'Person.age'行,你可以改变它为:

 'Person.age' : (new com.yourco.DataHelper()).getListOfAges()


这 假设你有一个类名为"DataHelper",它有一个方法"getListOfAges()",其返回一个字符串列表(并且是在类路径中)。当然,你可 以利用固定列表混合这些“动态”枚举。例如,你可以使用JBDC从一个数据库中加载。在一个会话中,你第一次使用指南编辑器,数据枚举会被加载。如果你有 一些指南编辑器会话打开——你将需要关闭,然后打开该规则,了解变化。要检查枚举被加载——如果你到包配置屏幕,你能够“保存和验证(save and validate)“该包——这将检查包,并提供一些任何错误反馈。

 

1.4.2.4.9  高级枚举概念

有一些其他的高级事情,你可以用数据枚举来做它。

依赖于字段值的下拉列表:让我们设想一个简单的事实模型,我们有一个类名为
Vehicle(机动车),它有2个字段: "engineType(发动机类型)" 和"fuelType(燃料类型)"。 我们希望为 "Petrol(汽油)" 或 "Diesel(柴油)"的"engineType(发动机类型)"做一个选择。现在,显然对燃料的选择类型必须取决于发动机类型(所以对于Petrol ,我们有ULP 和 PULP,对于Diesel我们有BIO和NORMAL)。我们可以像这样用一个枚举表达这种依赖关系: 
 'Vehicle.engineType' : ['Petrol', 'Diesel']  'Vehicle.fuelType[engineType=Petrol]' : ['ULP', 'PULP' ]  'Vehicle.fuelType[engineType=Diesel]' : ['BIO', 'NORMAL' ]  

这说明如何依赖于其他字段值做选择是可能的。注意,一但你点取了发动机类型,燃料类型的选择列表也会被决定。


用编程方式加载枚举:在某些情况下,人们可能想完全从外部数据源加载他们的枚举数据(如,一个关系数据库)。要做这,你可以实现一个返回一个映射(Map)的一个类。映射的key键是一个字符串(如上所示,它是一个
Fact.field名字),值是一个字符串的java.util.List


public class SampleDataSource2 {    public Map<<String>, List<String>> loadData() {     Map data = new HashMap();      List d = new ArrayList();     d.add("value1");     d.add("value2");     data.put("Fact.field", d);      return data;  }  }


在BRMS的枚举中,你设置:


=(new SampleDataSource2()).loadData() 


"="告之通过执行你的代码加载数据。


模 式高级枚举:在上面的情况下,在列表中的值预先被计算。这对于相对静止的数据或少量数据是很好的。设想一种情形,你有一个国家的列表,每个国家有一个州的 列表,每一个州有一个地区的列表,每个地区有一个街道的列表,依次类推。你可以看到这是多么大量的数据,并且不能被加载起来。应该被加载的列表取决于所选 的国家,等等……


好的,能够以下面的方式处理上面的情形:


      'Fact.field[dependentField1, dependentField2]' : '(new com.yourco.DataHelper()).getListOfAges("@{dependentField1}", "@{dependentField2}")'     


类似于上面的,但是注意我们只指定了需要的字段,并且在 ":" 的右边,用单引号把表达式括起来了。只在需要时,那么这个表达式才会被计算,根据指定的字段替代该值。这意味着你可以从GUI使用字段值来驱动一个数据库查询,并且深入到数据内,等等。当下拉列表被加载,或者该规则被加载,它会根据字段刷新该列表。'depenentField1'和'dependentField2' 在

'Fact'的

类型中的字段的名字——它们被用于计算值的列表,如果是该字段的,它会被显示在下拉列表中。

1.4.2.5  资产/规则的模板


提示:因为你可能有许多相似的规则,你可以创建规则模板,其仅仅是保存在一个非活动包(
 inactive package)中的规则——然后你可以相应地分类模板,并按需要复制它们(选取一个活动包作为作为目标包)。

1.4.2.6  状态管理


Guvnor中的每个资产(还有包)有一个状态标志集。状态标志的值在BRMS的Administration部分中设置。(你可以添加你自己的状态名字)。类似于分类 Categories,状态Statuses不会以任何方式影响执行,是纯信息的。不像分类,资产在同一时间只有一个状态。


使用状态完全是可选的。你可以使用它管理资产的生命周期(如果你喜欢,你可以用分类替代)。

Asset status

图 1.25  资产状态


你能够改变一个单独资产的状态(如上面的示图)。它会立即生效,不需要单独保存。

Asset status

图 1.26  资产状态


你可以改变整个包的状态——这会设置包自身的状态标志,但是它还一举改变了属于那个包的所有资产的状态(与你为包所设的相同)。


1.4.2.7  包管理 


配置包通常是由一些具有使用规则/模型经验的人
一次性做的事情。一般来说,很少有人会需要配置包,它们被一次性配置,如果需要可以反复地复制它们。包配置绝对是一个技术性的任务,需要相当的经验。


所有资产存活在BRMS的 "包packages"中 ——一个包就像一个文件夹(它还适合作为一个“命名空间”)。存在
一个规则资产的主文件夹。尤其是规则需要知道事实模型是那个,命名空间是谁,等等。


The package explorer

图1.27  包资源管理器


上面的图显示了资源管理器。点击一个资产类型会显示匹配的一个列表(对于有成千上成规则的包,显示列表会需要几分种——因此,使用分类帮助你查找是重要的)。


所 以,尽管规则(普通资产)可以显出在任何数量的分类中,但是它们只存活一个包中。如果你把BRMS看作一个文件系统,那么每个包就是一个文件夹,并且资产 存活在那个文件夹中——作为文件的一个大列表。当你创建一个包的部署快照时,你有效地复制了在那个“文件夹”中所有资产到另外一个特殊“文件夹”。


包管理功能允许你看见一个包的列表,然后“展开”它们,显示每个资产”类型“的列表(有很多资产,所以它们中的一些被分组在一起):


资产类型:

  • 业务资产(Business assets):这显示所有“业务规则”类型的一个列表,包括决策表、业务规则,等等。
  • 技术资产(Technical assets):这是被认为技术(例如,DRL规则、数据枚举和规则流)条目的一个列表。
  • 函数(Functions):在BRMS中,你也可以有函数定义(当然是可选的) you can also have functions defined (optionally of course).
  • DSL:域特殊语言也被存储作为一资产。如果它们存在(通常只有一个),那么它们会被用于相应的编辑器GUIs中。
  • 模型(Model):一个包至少需要一个模型——用于规则。: A package requires at least one model - for the rules.
  • 工作集(WorkingSets):工作集让你创建包的事实类型的子集,并应用约束到它们的字段。

Creating new assets

图1.28. 创建新的资产


从包资源管理器,你能够创建新规则,或新资产。某些资产,你能够从包资源管理器中创建。上面的图片显示的图标,为这个目的而启动向导。如果你移到鼠标到它们上面,一个工具提示条会告诉你它们做什么。


Package configuration

图 1.29  包配置


你需要做的关键事情之一是配置包。这主要是被规则使用的导入的类,和全局变量。一旦你做一改变,你需要保存它们,然后包被配置,并为构建作好了准备。例如,你可能添加一个模式,它有一个名为"com.something.Hello"的类,那么你应该在你的包配置中添加"import com.something.Hello",并且保存改变。


Package building

图 1.30 包构建


最后你应该“构建(build)”一个包。那么捕获的任何错误在这时会被显示。如果构建成功,那么你将有机会创建一个部署快照。你还可以浏览这个包产生的"drl"。警告:在大量规则的情况下,所有这些操作可能要花一些时间。


在这个阶段,输入“选择器
selector”的名字是可选的——有关如何为你的系统配置自定义选择器的详情,请看管理员(admin)章节(如果你需要它们——选择器允许你过滤你构建的东西到一个包中——如果你不了解它们是为了什么,你也许不需要使用它们)。

1.4.2.7.1  导入drl包

还 可以通过导入现有的"drl"文件创建一个包。当你选择创建一个新包时,你可以选择一个选项,上传一个.drl文件。然后BRMS会企图理解那个drl, 为你分解创建一个包。在它里面的规则会被作为单独的资产被存储(但是仍然作为drl文本内容)。注意,要真正地构建该包,你将需要
用一个单独的步骤上传相应的模式(以一个jar包)来验证。

1.4.2.8  版本管理
 
在BRMS中,资产和资产的整个包都被“版本化”,但是机制稍有不同。单项资产的保存有点像在资源控制系统中的文件版本。然而,资产的包通过采用快照(通常被用于部署)“按需”被版本化。接下来的章节谈论部署管理和快照。
Asset versions

图 1.31  资产版本


对一个资产做的每次改变,在版本历史中都会创建一个新条目。这有点像使用无限次撒销。通过像上面单项资产的历史列表,你可能回头从那个时间点浏览它(和恢复它)。

1.4.2.9  部署管理

快照, URLs和二进制包:

URLs主要是用于如何提供构建的包。BRMS通过URLs提供包(用于下载和被知识代理使用)。 这些URLs采用的形式为: http://<server>/drools-guvnor/org.drools.guvnor.Guvnor/package/<packageName>/<packageVersion>

<packageName> 是你提供的包的名字。 <packageVersion> 一个快照的名字,或者"最新的(LATEST)"(如果它是最新的,那么它将是根据主包最后构建的版本,不是一个快照)。你可以在代理中使用它们,或者你 可以粘贴它们到你的浏览器中,它会把它们作为一个文件下载。

如何能在你的应用程序使用这些
URLs(二进制下载包),以及规则如何能被联机更新,有关的细节请参考有关知识代理的章节。
Deployment snapshots

图 1.32  部署快照


上面所示是部署快照的视图。在左边有一个包的列表。点击一个特定的包,会显示给你那个包的一个快照的列表(如果有)。你可以从那儿复制、删除或浏览一个资产的快照。每个快照都可供于下载,或者通过部署的URL访问。


1.4.2.10   导航和查找规则


浏览仓库的两个主要方法是通过使用如上文所述的用户驱动分类(标签),和包资源管理器。


分类视图提供一种方法,以一种使你的安排有意义的方式导航你的规则。


Category view

图 1.33 分类视图


上面的图显示了在活动中的分类。通常在每个分类下面,如果可能,你不应该超过几十条规则。


可选的和更技术的浏览是使用包资源管理器。它所示的规则(资产)更接近于在数据库中实际如何被存储的,并且还分离规则到包(命名空间)和它们的类型中(格式,因为规则可能有多种不同的格式)。


Package view

图 1.34   包视图 


上面所示,为探索的备用方法——使用包。

 

posted @ 2011-11-09 18:06  skyme  阅读(2672)  评论(0)    收藏  举报