首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

应用 Drools 规则引擎实现业务逻辑

2012-11-12 
使用 Drools 规则引擎实现业务逻辑?然后选择下载的存档文件并将其导入工作区中。您将在工作区中发现一个名

使用 Drools 规则引擎实现业务逻辑

?

然后选择下载的存档文件并将其导入工作区中。您将在工作区中发现一个名为DroolsDemo的新 Java 项目,如图 2 所示:

图 2. 导入到工作区中的示例程序应用 Drools 规则引擎实现业务逻辑
  • 如果启用了Build automatically选项,则代码应该已编译并可供使用。如果未启用该选项,则现在构建DroolsDemo项目。


    在清单 4 中可以看到,RulesEngine类的构造函数接受字符串值形式的参数,该值表示包含业务规则集合的文件的名称。该构造函数使用PackageBuilder类的实例解析和编译源文件中包含的规则。(注意:该代码假设规则文件位于程序类路径中名为 rules 的文件夹中。)然后,使用PackageBuilder实例将所有编译好的规则合并为一个二进制Package实例。然后,使用这个实例配置 DroolsRuleBase类的一个实例,后者被分配给RulesEngine类的rules属性。可以将这个类的实例看作规则文件中所包含规则的内存中表示。

    清单 5 展示了RulesEngine类的executeRules()方法:


    清单 5.RulesEngine类的executeRules()方法

    如清单 10 所示,rule声明有一个惟一标识它的name。还可以看到,when关键词定义规则中的条件块,then关键词定义结果块。清单 10 中显示的规则有一个引用Machine对象的条件元素。如果回到清单 7可以看到,Machine对象被插入到WorkingMemory对象中。这正是这个规则中使用的对象。条件元素对Machine实例(知识的一部分)求值,以确定是否应执行规则的结果。如果条件元素等于true,则启动或执行结果。从清单 10 中还可以看出,结果只不过是一个 Java 语言语句。通过快速浏览该规则,可以很容易地识别出这是下列业务规则的实现:

    • 如果计算机是 Type1,则只能在该机器上执行 Test1、Test2 和 Test5。

      因此,该规则的条件元素检查(Machine对象的)type属性是否为Type1。 (在条件元素中,只要对象遵从 Java bean 模式,就可以直接访问对象的属性,而不必调用 getter 方法。)如果该属性的值为true,那么将Machine实例的一个引用分配给machine标识符。然后,在规则的结果块使用该引用,将测试分配给Machine对象。

      在该规则中,惟一看上去有些奇怪的语句是最后三条结果语句。回忆 “要解决的问题” 小节中的业务规则,应该分配为测试到期日期的值取决于分配给机器的测试。因此,分配给机器的测试需要成为规则执行引擎在对规则求值时所使用的知识的一部分。这正是这三条语句的作用。这些语句使用一个名为insert的方法更新规则引擎中的知识。


      如果将清单 16 中第一个规则的定义与清单 10中的定义相比较,可以看到,新方法没有将分配给Machine对象的Test实例插入到工作内存中,而是由规则的结果块调用update()方法,让规则引擎知道Machine对象已被修改。(Test实例被添加/指定给它。) 如果看看清单 16 中其他的规则,应该可以看到,每当将测试分配给一个Machine对象时,都采用这种方法:一个或多个Test实例被分配给一个Machine实例,然后,修改工作知识,并通知规则引擎。

      还应注意清单 16 中使用的active-lock属性。该属性的值被设为true;如果不是这样,在执行这些规则时将陷入无限循环。将它设为true可以确保当一个规则更新工作内存中的知识时,最终不会导致对规则重新求值并重新执行规则,也就不会导致无限循环。可以将active-lock属性 看作no-loop属性的加强版。no-loop属性确保当修改知识的规则更新后不会再被调用,而active-lock属性则确保在修改知识以后,文件中的任何规则(其 active-lock 属性被设为true)不会重新执行。

      清单 17 展示了其他规则有何更改:


      清单 17. testRules2.drl 中与分配测试到期日期有关的规则

    • 现在选择Arguments选项卡并输入-t demo.test.TestsRulesEngineTest作为程序参数(参见图 4)。输入该参数后,单击对话框右下角的Apply按钮,保存新的启动配置。然后,可以单击Debug按钮,开始以 “Drools Application” 的形式调试TestsRulesEngineTestJUnit 类。如果之前在 testRules1.drl 或 testRules2.drl 中添加了断点,那么当使用这个启动配置时,调试器应该会在遇到这些断点时停下来。


      图 4.TestsRulesEngineTest类的 Drools Application 启动配置(Arguments 选项卡)应用 Drools 规则引擎实现业务逻辑
    • 结束语

      使用规则引擎可以显著降低实现 Java 应用程序中业务规则逻辑的组件的复杂性。使用规则引擎以声明方法表达规则的应用程序比其他应用程序更容易维护和扩展。正如您所看到的,Drools 是一种功能强大的灵活的规则引擎实现。使用 Drools 的特性和能力,您应该能够以声明方式实现应用程序的复杂业务逻辑。Drools 使得学习和使用声明式编程对于 Java 开发人员来说相当容易。

      本文展示的 Drools 类是特定于 Drools 的。如果要在示例程序中使用另一种规则引擎实现,代码需要作少许更改。因为 Drools 是 JSR 94 兼容的,所以可以使用 Java Rule Engine API(如 JSR 94 中所指定)设计特定于 Drools 的类的接口。(Java Rule Engine API 用于 JDBC 在数据库中的规则引擎。)如果使用该 API,则可以无需更改 Java 代码而将规则引擎实现更改为另一个不同的实现,只要这个不同的实现也是 JSR 94 兼容的。JSR 94 不解析包含业务规则的规则文件(在本文示例应用程序中为 testRules1.drl)的结构。文件的结构将仍取决于您选择的规则引擎实现。作为练习,可以修改示例程序以使它使用 Java Rule Engine API,而不是使用 Java 代码引用特定于 Drools 的类。

      原文地址:http://www.ibm.com/developerworks/cn/java/j-drools/#download

  • 热点排行