使用 Drools 规则引擎实现业务逻辑.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《使用 Drools 规则引擎实现业务逻辑.docx》由会员分享,可在线阅读,更多相关《使用 Drools 规则引擎实现业务逻辑.docx(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性,降低应用程序的维护和可扩展性成本。这篇更新的文章展示如何使用开源的 Drools 规则引擎让 Java 应用程序更适应变化。Drools 项目引入了一个新的本地规则表达式语言和一个 Eclipse 插件,使 Drools 比以前更容易使用。要求施加在当今软件产品上的大多数复杂性是行为和功能方面的,从而导致组件实现具有复杂的业务逻辑。实现 J2EE 或 J2SE 应用程序中业务逻辑最常见的方法是编写 Java 代码来实现需求文档的规则和逻辑。在大多数情况下,该代码的错综复杂性使得维护和更新应用程序的业务逻辑成为一项令人畏惧的任务,甚至对于经
2、验丰富的开发人员来说也是如此。任何更改,不管多么简单,仍然会产生重编译和重部署成本。规则引擎试图解决(或者至少降低)应用程序业务逻辑的开发和维护中固有的问题和困难。可以将规则引擎看作实现复杂业务逻辑的框架。大多数规则引擎允许您使用声明性编程来表达对于某些给定信息或知识有效的结果。您可以专注于已知为真的事实及其结果,也就是应用程序的业务逻辑。有多个规则引擎可供使用,其中包括商业和开放源码选择。商业规则引擎通常允许使用专用的类似英语的语言来表达规则。其他规则引擎允许使用脚本语言(比如 Groovy 或 Python)编写规则。这篇更新的文章为您介绍 Drools 引擎,并使用示例程序帮助您理解如何
3、使用 Drools 作为 Java 应用程序中业务逻辑层的一部分。更多事情在变化俗话说得好,“惟一不变的是变化。”软件应用程序的业务逻辑正是如此。出于以下原因,实现应用程序业务逻辑的组件可能必须更改: 在开发期间或部署后修复代码缺陷 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内 处理客户已更改的业务目标 符合组织对敏捷或迭代开发过程的使用如果存在这些可能性,则迫切需要一个无需太多复杂性就能处理业务逻辑更改的应用程序,尤其是当更改复杂 if-else 逻辑的开发人员并不是以前编写代码的开发人员时。Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法(参阅参考资
4、料)对所编写的规则求值。Drools 允许使用声明方式表达业务逻辑。可以使用非 XML 的本地语言编写规则,从而便于学习和理解。并且,还可以将 Java 代码直接嵌入到规则文件中,这令 Drools 的学习更加吸引人。Drools 还具有其他优点: 非常活跃的社区支持 易用 快速的执行速度 在 Java 开发人员中流行 与 Java Rule Engine API(JSR 94)兼容(参阅参考资料) 免费当前 Drools 版本在编写本文之际,Drools 规则引擎的最新版本是。这是一个重要更新。虽然现在还存在一些向后兼容性问题,但这个版本的特性让 Drools 比以前更有吸引力。例如,用于表
5、达规则的新的本地语言比旧版本使用的 XML 格式更简单,更优雅。这种新语言所需的代码更少,并且格式易于阅读。另一个值得注意的进步是,新版本提供了用于 Eclipse IDE(Versions 3.2 和)的一个 Drools 插件。我强烈建议您通过这个插件来使用 Drools。它可以简化使用 Drools 的项目开发,并且可以提高生产率。例如,该插件会检查规则文件是否有语法错误,并提供代码完成功能。它还使您可以调试规则文件,将调试时间从数小时减少到几分钟。您可以在规则文件中添加断点,以便在规则执行期间的特定时刻检查对象的状态。这使您可以获得关于规则引擎在特定时刻所处理的知识(knowledge
6、)(在本文的后面您将熟悉这个术语)的信息。要解决的问题本文展示如何使用 Drools 作为示例 Java 应用程序中业务逻辑层的一部分。为了理解本文,您应该熟悉使用 Eclipse IDE 开发和调试 Java 代码。并且,您还应该熟悉 JUnit 测试框架,并知道如何在 Eclipse 中使用它。下列假设为应用程序解决的虚构问题设置了场景: 名为 XYZ 的公司构建两种类型的计算机机器:Type1 和 Type2。机器类型按其架构定义。 XYZ 计算机可以提供多种功能。当前定义了四种功能:DDNS Server、DNS Server、Gateway 和 Router。 在发运每台机器之前,X
7、YZ 在其上执行多个测试。 在每台机器上执行的测试取决于每台机器的类型和功能。目前,定义了五种测试:Test1、Test2、Test3、Test4 和 Test5。 当将测试分配给一台计算机时,也将测试到期日期分配给该机器。分配给计算机的测试不能晚于该到期日期执行。到期日期值取决于分配给机器的测试。 XYZ 使用可以确定机器类型和功能的内部开发的软件应用程序,自动化了执行测试时的大部分过程。然后,基于这些属性,应用程序确定要执行的测试及其到期日期。 目前,为计算机分配测试和测试到期日期的逻辑是该应用程序的已编译代码的一部分。包含该逻辑的组件用 Java 语言编写。 分配测试和到期日期的逻辑一个
8、月更改多次。当开发人员需要使用 Java 代码实现该逻辑时,必须经历一个冗长乏味的过程。何时使用规则引擎?并非所有应用程序都应使用规则引擎。如果业务逻辑代码包括很多 if-else 语句,则应考虑使用一个规则引擎。维护复杂的 Boolean 逻辑可能是非常困难的任务,而规则引擎可以帮助您组织该逻辑。当您可以使用声明方法而非命令编程语言表达逻辑时,变化引入错误的可能性会大大降低。如果代码变化可能导致大量的财政损失,则也应考虑规则引擎。许多组织在将已编译代码部署到托管环境中时具有严格的规则。例如,如果需要修改 Java 类中的逻辑,在更改进入生产环境之前,将会经历一个冗长乏味的过程:1. 必须重新
9、编译应用程序代码。2. 在测试中转环境中删除代码。3. 由数据质量审核员检查代码。4. 由托管环境架构师批准更改。5. 计划代码部署。即使对一行代码的简单更改也可能花费组织的几千美元。如果需要遵循这些严格规则并且发现您频繁更改业务逻辑代码,则非常有必要考虑使用规则引擎。对客户的了解也是该决策的一个因素。尽管您使用的是一个简单的需求集合,只需 Java 代码中的简单实现,但是您可能从上一个项目得知,您的客户具有在开发周期期间甚至部署之后添加和更改业务逻辑需求的倾向(以及财政和政治资源)。如果从一开始就选择使用规则引擎,您可能会过得舒服一些。因为在对为计算机分配测试和到期日期的逻辑进行更改时,公司
10、会发生高额成本,所以 XYZ 主管已经要求软件工程师寻找一种灵活的方法,用最少的代价将对业务规则的更改 “推” 至生产环境。于是 Drools 走上舞台了。工程师决定,如果它们使用规则引擎来表达确定哪些测试应该执行的规则,则可以节省更多时间和精力。他们将只需要更改规则文件的内容,然后在生产环境中替换该文件。对于他们来说,这比更改已编译代码并在将已编译代码部署到生产环境中时进行由组织强制的冗长过程要简单省时得多(参阅侧栏何时使用规则引擎?)。目前,在为机器分配测试和到期日期时必须遵循以下业务规则: 如果计算机是 Type1,则只能在其上执行 Test1、Test2 和 Test5。 如果计算机是
11、 Type2 且其中一个功能为 DNS Server,则应执行 Test4 和 Test5。 如果计算机是 Type2 且其中一个功能为 DDNS Server,则应执行 Test2 和 Test3。 如果计算机是 Type2 且其中一个功能为 Gateway,则应执行 Test3 和 Test4。 如果计算机是 Type2 且其中一个功能为 Router,则应执行 Test1 和 Test3。 如果 Test1 是要在计算机上执行的测试之一,则测试到期日期距离机器的创建日期 3 天。该规则优先于测试到期日期的所有下列规则。 如果 Test2 是要在计算机上执行的测试之一,则测试到期日期距离机
12、器的创建日期 7 天。该规则优先于测试到期日期的所有下列规则。 如果 Test3 是要在计算机上执行的测试之一,则测试到期日期距离机器的创建日期 10 天。该规则优先于测试到期日期的所有下列规则。 如果 Test4 是要在计算机上执行的测试之一,则测试到期日期距离机器的创建日期 12 天。该规则优先于测试到期日期的所有下列规则。 如果 Test5 是要在计算机上执行的测试之一,则测试到期日期距离机器的创建日期 14 天。捕获为机器分配测试和测试到期日期的上述业务规则的当前 Java 代码如清单 1 所示:清单 1. 使用 if-else 语句实现业务规则逻辑 Machine machine =
13、 ./ Assign testsCollections.sort(machine.getFunctions();int index;if (machine.getType().equals(Type1) Test test1 = . Test test2 = . Test test5 = . machine.getTests().add(test1); machine.getTests().add(test2); machine.getTests().add(test5); else if (machine.getType().equals(Type2) index = Collections
14、.binarySearch(machine.getFunctions(), Router); if (index = 0) Test test1 = . Test test3 = . machine.getTests().add(test1); machine.getTests().add(test3); index = Collections.binarySearch(machine.getFunctions(), Gateway); if (index = 0) Test test4 = . Test test3 = . machine.getTests().add(test4); mac
15、hine.getTests().add(test3); ./ Assign tests due dateCollections.sort(machine.getTests(), new TestComparator();.Test test1 = .index = Collections.binarySearch(machine.getTests(), test1);if (index = 0) / Set due date to 3 days after Machine was created Timestamp creationTs = machine.getCreationTs(); m
16、achine.setTestsDueTime(.); return;index = Collections.binarySearch(machine.getTests(), test2);if (index = 0) / Set due date to 7 days after Machine was created Timestamp creationTs = machine.getCreationTs(); machine.setTestsDueTime(.); return;.清单 1 中的代码不是太复杂,但也并不简单。如果要对其进行更改,需要十分小心。一堆互相缠绕的 if-else 语
17、句正试图捕获已经为应用程序标识的业务逻辑。如果您对业务规则不甚了解,就无法一眼看出代码的意图。导入示例程序使用 Drools 规则的示例程序附带在本文的 ZIP 存档中。程序使用 Drools 规则文件以声明方法表示上一节定义的业务规则。它包含一个 Eclipse 3.2 Java 项目,该项目是使用 Drools 插件和 4.0.4 版的 Drools 规则引擎开发的。请遵循以下步骤设置示例程序:1. 下载 ZIP 存档(参见下载)。2. 下载并安装 Drools Eclipse 插件(参见参考资料)。3. 在 Eclipse 中,选择该选项以导入Existing Projects into
18、 Workspace,如图 1 所示:图 1. 将示例程序导入到 Eclipse 工作区4. 然后选择下载的存档文件并将其导入工作区中。您将在工作区中发现一个名为DroolsDemo的新 Java 项目,如图 2 所示:图 2. 导入到工作区中的示例程序如果启用了Build automatically选项,则代码应该已编译并可供使用。如果未启用该选项,则现在构建DroolsDemo项目。检查代码现在来看一下示例程序中的代码。该程序的 Java 类的核心集合位于demo包中。在该包中可以找到Machine和Test域对象类。Machine类的实例表示要分配测试和测试到期日期的计算机机器。下面来看
19、Machine类,如清单 2 所示:清单 2.Machine类的实例变量 public class Machine private String type; private List functions = new ArrayList(); private String serialNumber; private Collection tests = new HashSet(); private Timestamp creationTs; private Timestamp testsDueTime; public Machine() super(); this.creationTs = ne
20、w Timestamp(System.currentTimeMillis(); .在清单 2 中可以看到Machine类的属性有: type(表示为string属性) 保存机器的类型值。 functions(表示为list) 保存机器的功能。 testsDueTime(表示为timestamp变量) 保存分配的测试到期日期值。 tests(Collection对象) 保存分配的测试集合。注意,可以为机器分配多个测试,而且一个机器可以具有一个或多个功能。出于简洁目的,机器的创建日期值设置为创建Machine类的实例时的当前时间。如果这是真实的应用程序,创建时间将设置为机器最终构建完成并准备测试的
21、实际时间。Test类的实例表示可以分配给机器的测试。Test实例由其id和name惟一描述,如清单 3 所示:清单 3.Test类的实例变量 public class Test public static Integer TEST1 = new Integer(1); public static Integer TEST2 = new Integer(2); public static Integer TEST3 = new Integer(3); public static Integer TEST4 = new Integer(4); public static Integer TEST5
22、 = new Integer(5); private Integer id; private String name; private String description; public Test() super(); .示例程序使用 Drools 规则引擎对Machine类的实例求值。基于Machine实例的type和functions属性的值,规则引擎确定应分配给tests和testsDueTime属性的值。在demo包中,还会发现Test对象的数据访问对象 (TestDAOImpl) 的实现,它允许您按照 ID 查找Test实例。该数据访问对象极其简单;它不连接任何外部资源(比如关系数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Drools 规则引擎实现业务逻辑 规则 引擎 实现 业务 逻辑
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内