使用动态域在 WebSphere Operational Decision Management 中实现灵活的规则编写

确保规则的准确性是 WebSphere Operational Decision Management 中的规则开发的一个重要组成部分。本文将演示如何使用一个用 Microsoft® Excel® 文件填充的动态域来提高编写规则时的准确性。使用这些域还可以消除对代码更改方面的 IT 支持的依赖,因为业务用户可以通过对 Decision Center 中电子数据表进行简单修改来扩展域中的值的集合。此外,因为添加域值不会导致修改服务契约 (service contract),所以不必重新部署规则服务。 本文来自于 IBM Business Process Management Journal 中文版

Raj Rao, 决策管理高级解决方案架构师, IBM

Rajesh (Raj) Rao在专家系统和业务规则管理系统方面有 20 多年的工作经验,在这期间,他应用业务规则技术跨越各个领域,比如制造、运输和金融业,来构建诊断、日程安排、资格证书和配置应用程序。他在 IBM 工作已经快 2 年了。他有 Artificial Intelligence 背景,感兴趣的领域包括 Natural Language Processing 和 Semantic Web。



Catherine Rivi, IBM 认证的 IT 专家, IBM

Cathy Rivi 是一名 IBM 认证的 IT 专家,在 IBM (I4I) 团队中负责 IBM Software Services for WebSphere 方面的研究。她专门负责测试 IBM 内部应用程序,在 WebSphere 的产品归档方面有着丰富的经验。



2013 年 5 月 20 日

简介

本文演示了使用 WebSphere Operational Decision Management (ODM) 中业务规则时,如何创建和更改动态域。截屏是使用 IBM ODM V7.5 完成的,但本文内容对 IBM ODM V8 同样适用。在定义示例规则时,期望使用类型为 String 的值。然后您可以将规则转换成期望的值,通过一个枚举域对这些值进行约束。这个域由 Excel 文件进行动态填充。本文将引导您完成转换和测试 Rule Designer 中规则的所有步骤,并介绍业务用户可以在 Decision Center 中如何修改或扩展域。

本文假设以下前提条件成立:

  • 读者熟悉 WebSphere Operational Decision Management V7.5 中的规则设计和开发。
  • 成功安装 IBM WebSphere Operational Decision management V7.5。
  • 已安装 Microsoft Excel 2003 或 2007。

什么是动态域?

WebSphere Operational Decision Management V7.5 支持使用各种域来进行规则开发。域对 Business Object Model (BOM) 中的类型元素施加了限制。WebSphere ODM 支持静态、动态、枚举和复杂的域。例如,规则编辑中可以使用枚举域来表示对规则作者的有效选择。动态域就是使用 Excel 文件或其他数据源中值的枚举域。域用数据源动态填充。这提供了进行动态修改,然后同步域与数据源的灵活性。

为何使用动态域?

动态域可为规则开发人员和业务用户带来许多好处:

  • 通过限制业务用户对预先定义好的值集合进行选择,规则开发人员可以预防出现错误。
  • 业务用户可以轻松地扩展或修改动态域,而静态枚举则需要 IT 支持才能进行修改。
  • 给动态域添加值不需要修改规则服务契约。

防止出现错误。规则设计中的一个重要最佳实践就是,创建在使用的时候可以确保准确性和一致性的规则。提前确保一致性可以防止规则执行期间下游出现验证错误。例如,某条规则的一个子句期望使用语言名称,格式指定为字符串。该规则可能表述如下,如果请求的语言为英语,那么将使用这种语言传输响应。其他期望的语言字符串还可能为德语或意大利语,但只有正确输入字符串规则才会生效。

图 1. 定义规则时指定一个字符串
定义规则时指定一个字符串

在编写规则期间,业务用户可能会不小心拼错字符串,或者使用大小写混合的形式。只有字符串完全匹配,规则才能成功执行;用户错误将会导致规则被误用或者根本不起作用。

为了加强对规则的限制,减少错误发生的概率,可以使用一个枚举列表来替换字符串。这样可以提高规则的准确性,但是,如果要扩展该列表,则需要另外编码。这可能引起延迟,因为业务用户需要等待实现、测试和发布更改,以便使用这些更改。

推荐的最佳实践是在动态域中表示被期望的值。动态域就是一个预先定义好的值的集合,业务用户可以在不需要额外的开发周期和测试时间的情况下轻松扩展它。在本示例中,域用于限制对预先定义好的语言列表的选择。

图 2. 从一个预先定义好的列表中选择语言
从一个预先定义好的列表中选择语言

让用户自由扩展规则的有效参数。如果域的底层数据源是 Excel 文件,那么在 Decision Center 中编写规则的业务用户可以轻松添加或删除值。对电子数据表进行简单的编辑,然后更新相应的决策表会引发一些变化。这种灵活性可以让用户不再依赖于开发人员进行必要的代码更改,从而缩短部署更改的时间。

减少更改服务契约的需求。除了减少对开发人员的依赖之外,使用域代替静态枚举的一个重要好处是添加域值不会导致更改服务契约。因此,开发人员无需重新部署规则服务或修改服务客户端。相反,使用动态域时,因为服务契约没有描述可能的域值,所以它的自我描述能力将会削弱。这些值需要传送到契约之外的服务客户端。


创建一个动态域

本节将介绍示例的规则项目(在 下载 中可以找到相关链接),并描述转换规则所需的步骤,以便让期望的参数使用枚举类型 LanguageType 代替字符串类型。

步骤 1:导入包和检查规则

  1. 打开 Rule Designer。从 File 菜单中选择 Import
  2. 展开 General,选择 Existing Projects into Workspace,然后单击 Next
    图 3. 选择一个导入源
    选择一个导入源
  3. 在 Import Projects 对话框中,选择 Select archive file。浏览至本文中提供的 可下载的 hello-rules 压缩包 所在的位置。单击 Open,然后单击 Finish
    图 4. 选择要导入的存档文件
    选择要导入的存档文件

HelloRequest 和 HelloResponse 类

在我们的示例中,Execution Object Model (XOM) 包含两个 Java™ 类:一个请求和一个响应。HelloRequest 类使用一种语言(一个字符串)作为输入,而 HelloResponse 类使用请求指定的语言返回一条消息。

图 5. HelloRequest 和 HelloResponse 类
HelloRequest 和 HelloResponse 类

Business Object Model (BOM) 从带有这两个类的 XOM 中生成。

图 6. Business Object Model (BOM)
Business Object Model (BOM)

Messages 规则包(位于 rules/messages 文件夹下)包含一个 Greetings 决策表,如 图 7 中所示。

图 7. Greetings 决策表
Greetings 决策表

规则集合中存在六条规则(每一行对应一条规则)。如果请求中指定的语言是英语,返回的问候为 "Hello"。如果请求的语言为德语,那么返回的问候为 "Hallo"。在这个初始的决策表中,语言的类型为 String。稍后,我们将把语言限制为从一个预定义集合 LanguageType 中取类型的值。

项目包含一种带有两种场景的 Decision Validation Services (DVS) 测试配置和所期望的值(在 hello-rules/testsuite.xlsx 中),如 图 8 中所示。

图 8. Decision Validation Services 测试场景
Decision Validation Services 测试场景

要执行 DVS 测试套件,在 hello-rules 中右键单击 DVS test.launch,然后以 DVS 测试的形式运行。图 9 显示了测试套件的执行结果。要查看结果,请右键单击 report.html 文件,然后选择 Open With => Web Browser

图 9. DVS 测试的执行结果
DVS 测试的执行结果

步骤 2:创建一个定义域的 domains.xlsx 文件

接下来,为动态域创建一个 Excel 电子数据表。在文本中,该文件已在 Resources 文件夹中创建完毕,名为 domains.xlsx,内容如下:

图 10. domains.xlsx 文件
domains.xlsx 文件

Excel 域提供程序负责处理 Excel 电子数据表中的值与 BOM 之间的链接。Excel 文件中的每一行必须对应域提供程序的每个值。该文件必须符合这种结构:

  • Values 列包含域提供程序的值。
  • BOM to XOM mapping 列指示每个域值的 BOM 到 XOM 映射。
  • Label 列给出了编写规则时将会显示的每种语言(域值的表达)。

步骤 3:创建新的 BOM 条目

  1. 右键单击 bom 目录,然后选择 New => BOM Entry
  2. 在 New BOM Entry 对话框中,输入 virtual 作为名称,并选择 Create an empty BOM entry,然后单击 Finish
    图 11. 创建一个新的 BOM 条目
    创建一个新的 BOM 条目

步骤 4:创建新的 BOM 类 LanguageType

  1. 在 Rule Explorer 中,双击刚刚创建的 BOM 条目并选择 New Class
    图 12. 创建 LanguageType 类
    创建 LanguageType 类
  2. LanguageType 指定为类名,然后单击 Finish。结果如 图 13 中所示。
    图 13. LanguageType 类
    LanguageType 类

步骤 5:为类创建域

  1. 双击 LanguageType。在 Domain 下单击 Create
    图 14. 为类创建一个域
    为类创建一个域
  2. 在 Domains 对话框中,展开 Dynamic Domains,选择 Excel,然后单击 Next
    图 15. 选择域类型 (Excel)
    选择域类型 (Excel)
  3. 输入定义域的 Excel 文件名称。将 Languages 指定为工作表名称。一定要选择 Table with header,然后为 Value 列选择 Values,为 BOM to XOM 列选择 BOM to XOM,为 Label 列选择 Label,然后单击 Finish
    图 16. Excel 文件的列映射
    Excel 文件的列映射

    域值现在以类的成员形式出现。

    图 17. 域值
    域值
  4. 展开 BOM to XOM Mapping 区域。您可能需要最大化选项卡并向下滚动才能看到这个区域。
  5. java.lang.String 指定为 BOM to XOM Mapping 的 Execution name
    图 18. 将 BOM 类映射到 XOM
    将 BOM 类映射到 XOM
  6. 保存项目。

步骤 6:创建 HelloRequest 类的一个新成员

  1. 在 bom/hello-xom 目录中,导航到 HelloRequest 类,双击 language 并删除言语描述。选择 Ignore for DVS,这样测试期间就不会使用任何语言。
    图 19. 删除 HelloRequest 类的原始语言描述
    删除 HelloRequest 类的原始语言描述
  2. 保存您的工作。

    提示:您将看到 Rule Explorer 视图中出现错误。但在完成余下的步骤后,这些错误都将会得到解决。

  3. 创建 HelloRequest 类的一个新成员,将它命名为 languageVirtual。双击 HelloRequest 类。在 Members 区域下,单击 New。指定 languageVirtual 作为名称。单击 Browse,然后选择 LanguageType(而非字符串)作为 Type 字段的值。单击 OK,然后单击 Finish
  4. 保存您的工作。
    图 20. 创建 languageVirtual 成员
    创建 languageVirtual 成员
  5. 双击成员 languageVirtual
    图 21. 选择 languageVirtual 成员
    选择 languageVirtual 成员
  6. Member Verbalization 区域下,单击 Create 创建默认的语言描述。
    图 22. 为 languageVirtual 创建默认的语言描述
    为 languageVirtual 创建默认的语言描述
  7. 单击 Edit the subject used in phrases 可以修改语言描述。
    图 23. 编辑语言描述
    编辑语言描述
  8. 在对话框中将 language virtual 更改为 language,然后单击 OK
    图 24. 编辑语言描述内容
    编辑语言描述内容
  9. 从 Action 子句中删除单词 virtual,让最终的语言描述与 图 25 相匹配。
    图 25. 最终的语言描述
    最终的语言描述
  10. BOM to XOM Mapping 区域下,定义新成员的 getter 和 setter,如 图 26 中所示。您可能需要将选项卡最大化,然后向下滚动才能看到这个区域。
    图 26. 为 languageVirtual 成员定义 getter 和 setter
    为 languageVirtual 成员定义 getter 和 setter
  11. 保存您的工作。

到现在为止,您已经创建了一个代表底层语言的新属性,为它定义 getters 和 setters,描述它,并将它的类型指定为 LanguageType。您也可以从原始语言中删除语言描述。

步骤 7:修改对应的规则

原始规则的期望形式是一个字符串。因此,必须将规则调整为期望输入类型为 languageType

  1. 在 rules/messages 文件夹下,双击 Greetings 决策表。String 现在是一个无效的类型。
    图 27. 现有的规则包含一个无效类型 (string)
    现有的规则包含一个无效类型 (string)
  2. 要纠正这一点,请右键单击列标题 Language,然后选择 Edit Condition Column
    图 28. 选择 Edit Condition Column
    选择 Edit Condition Column
  3. 编辑 Condition Column,并将它指定为 LanguageType 而不是字符串。
    图 29. 使用 LanguageType 代替字符串
    使用 LanguageType 代替字符串
  4. 依次单击 ApplyOK
  5. 双击 Language 列中的每个字符串,然后才从下拉列表中选择正确的值(例如,选择 English 代表英语)。
  6. 保存您的工作。

最终得到的决策表应该类似于 图 30

图 30. 修改后的决策表
修改后的决策表

步骤 8:重新运行测试

在这个步骤中,返回 DVS 测试作为回归测试,确保新创建的动态域不会影响所期望的的结果。

  1. 右键单击 folder 文件夹,然后选择 Run => Run Configurations
  2. DVS Excel file 下选择 DVS test
  3. 检查包含测试套件的 Excel 文件的路径,并指出新的 HTML 输出报告的目标位置。依次单击 ApplyRun
    图 31. 设置并运行 DVS 测试
    设置并运行 DVS 测试
  4. 使用浏览器查看 HTML 报告,以便核实测试结果。

步骤 9:向电子数据表添加新值

  1. 首先打开 domains.xlsx 电子数据表,并为每个新值创建一个新行。在这个示例中,已经为 Alsatian 与 Portuguese 语言创建了一个行。
    图 32. 在 Excel 文件中添加新值
    在 Excel 文件中添加新值
  2. 保存文件并刷新资源文件夹。
  3. 在文件夹 bom => virtual 下,双击 LanguageType 类。在 Domain type: Excel 下,单击 Synchronize。新值将会出现在类成员的列表中。
    图 33. 同步新的域值与类
    同步新的域值和类

    提示:在对域进行任意更新后,刷新包含 Excel 文件的资源文件夹,然后使用 Synchronize 链接同步更新与类。

  4. 返回到规则包中的 Greetings 决策表。使用下拉菜单选择新语言,然后在 Greeting 列中输入期望的响应。
  5. 保存项目。
    图 34. 更新决策表
    更新决策表

接下来,您可以添加场景来覆盖新添加的语言,从而扩展测试套件。

步骤 10:发布到 Decision Center

  1. Start 菜单启动 Sample 服务器(如果它尚未启动)。
    图 35. 启动 Sample 服务器
    启动 Sample 服务器
  2. 右键单击 hello-rules 项目文件夹,然后选择 Decision Center => Connect。输入用于访问 Decision Center 的 URL,并提供您的身份验证信息,然后单击 Connect
    图 36. 配置到 Decision Center 的连接
    配置到 Decision Center 的连接
  3. 在完成远程操作与同步之后,单击 OK
  4. 单击 Finish
    图 37. 连接到 Decision Center
    连接到 Decision Center

    成功完成同步之后,您会看到下面这条指示同步完成的消息。

    图 38. 与 Decision Center 的成功同步
    与 Decision Center 的成功同步

在 Decision Center 中修改动态域

使用动态域允许业务用户快速实现和部署对业务规则的修改,无需 IT 支持人员的帮助。使用枚举开发的规则需要修改代码才能容纳新值。借助动态域,业务用户可以对定义域的底层 Excel 电子数据表进行简单的编辑。新值可立即用于测试、部署以及与 Rule Designer 的最终同步。

以下步骤演示了业务用户如何在预先定义好的语言列表中添加新值。这些步骤假设 hello-rules 项目已经与 Decision Center 同步并且可以使用。

步骤 1:登录到 Decision Center 中

  1. 在 Decision Center 登录页面上输入您的用户名和密码。
    图 39. 登录到 Decision Center 中
    登录到 Decision Center 中
  2. Home 选项卡上,从 Project in use 列表中选择您的项目。
    图 40. 在 Decision Center 中选择一个项目
    在 Decision Center 中选择一个项目
  3. Explore 选项卡上,在 Business Rules 下检查从 Rule Designer 导入的 Greetings 决策表的值。单击 Greetings 链接。
    图 41. 访问 Greetings 决策表
    访问 Greetings 决策表

    Greetings 决策表显示在 Decision Center 中。

    图 42. Greetings 决策表
    图 42. Greetings 决策表

步骤 2:创建一个 Resources 智能文件夹

  1. Explore 选项卡上单击 Create Smart Folder 图标,然后创建一个名为 Resources 的新的智能文件夹。
    图 43. Create Smart Folder 图标
    Create Smart Folder 图标
  2. 在 Properties 选项卡上,指定 Resources 作为文件名,然后单击 Next
    图 44. 创建一个 Resources 文件夹
    创建一个 Resources 文件夹
  3. 对于 Step 2. Query,请单击 all business rules 并从下拉菜单中选择 all resources,这表明将会搜索并显示所有资源。单击 Finish
    图 45. 为 Resources 文件夹指定一个查询
    为 Resources 文件夹指定一个查询

    domains.xlsx 文件应该出现在新文件夹中。

    图 46. Resources 文件夹中的 domains.xlsx 文件
    Resources 文件夹中的 domains.xlsx 文件

步骤 3:修改 Resources 文件夹中的 domains.xlsx 文件

在这个步骤中,我们将 Excel 文件下载到本地磁盘上,并添加代表一种新的语言 Swedish 的新行。接下来,我们将该文件上传至 Decision Center 并刷新项目。

  1. 单击文件名称旁边的下载按钮。将文件保存到您的本地磁盘上,然后打开它进行编辑。
    图 47. 下载 domains.xlsx 文件
    下载 domains.xlsx 文件
  2. 编辑该文件,为 Swedish 语言添加一个新行,然后保存文件。
    图 48. 向 Excel 文件添加一个新行
    向 Excel 文件添加一个新行
  3. 回到 Decision Center 中,单击 domain.xlsx 链接,然后单击 Edit
    图 49. 编辑指向 domains.xlsx 文件的链接
    编辑指向 domains.xlsx 文件的链接
  4. 单击 Browse,选择更新后的 domains.xlsx 文件,单击 Open 将文件上传至 Decision Center,然后单击 Finish
    图 50. 上传新的 domains.xlsx 文件
    上传新的 domains.xlsx 文件

    现在,Resources 智能文件夹中显示了更新后的 domains.xlsx 文件。

    图 51. 已上传的 domains.xlsx 文件
    已上传的 domains.xlsx 文件

步骤 4:重新加载动态域

Project 选项卡上选择 Reload Dynamic Domains 来刷新项目。单击 OK

图 52. 重新加载动态域
重新加载动态域

步骤 5:向决策表添加新值

现在可以在编写规则时使用新值 Swedish。

  1. Explorer 选项卡上,展开 Business Rules,单击 Greetings 链接,然后单击 Edit
    图 53. 选择 Greetings 决策表
    选择 Greetings 决策表

    单击 Edit 将会显示决策表的可编辑视图。

    图 54. 编辑决策表
    编辑决策表
  2. 选择 Step 2: Table 并使用下拉菜单来显示刷新后的预定义语言值列表。在 Language 列中,选择 Swedish
    图 55. 选择 Languages 列中的新值
    选择 Languages 列中的新值
  3. 在 Greeting 列中,给出请求 Swedish 时要显示的经过转换的值。
    图 56. 在 Greeting 列中输入经过转换的值
    在 Greeting 列中输入经过转换的值
  4. 单击 Finish 保存您的工作。

新值可立即在规则编写过程中使用。

图 57. 在规则定义中使用新值
图 57. 在规则定义中使用新值

结束语

本文演示了在 WebSphere Operational Decision Management V7.5 中使用动态域的优势。使用动态域可以确保在规则编写期间进行错误预防,提供了比使用静态枚举更多的优势。通过使用一个简单的 Excel 文件作为域的底层数据源,规则开发人员可以为业务用户提供一定的灵活性,允许他们在无需 IT 支持的情况下在 Decision Center 中修改域。此外,添加新的域值不会导致服务契约变更,所以开发人员无需重新部署规则服务或修改服务客户端。


下载

描述名字大小
样本规则项目hello-rules.zip63KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=930389
ArticleTitle=使用动态域在 WebSphere Operational Decision Management 中实现灵活的规则编写
publish-date=05202013