`

规则引擎:Drools与JRuleEngine

阅读更多
译文:《规则引擎:Drools与JRuleEngine》
译者:jacktom(chszs)
作者:Vivek Tomar
原文:《Rule engine : Drools / JRuleEngine》
原文见http://www.naxos-software.de/blog/index.php?/archives/78-Rule-engine-Drools-JRuleEngine.html

一、规则引擎
规则引擎有助于基于存储在规则中的知识和推理来执行判断。这些规则基本上只有条件和动作,别无它物。

规则引擎的优点:
1、分隔应用程序的条件和控制流
(1) 规则都存储在单独的文件。
(2) 规则可以被技术人士和商业人士修改的。
(3) 规则改变后应用程序不必重新部署。
(4) 使用集中的规则使得应用程序更易于管理和维护。

2、规则替换了代码中的if else语句
(1) 规则脚本更容易提取。
(2) 即使是非技术人员也能轻易地遵循规则。
(3) 集中可以解决问题,而不是实现。
(4) 与实现代码相比,规则聚团更容易编写。

3、为什么作决定能很容易地概念化

总结:规则有助于消除代码中大量的if else语句,使代码更易于维护。

二、Drools介绍
Drools是一个开源实现。它是一个Java库,以Apache许可证发布,其二进制代码或源码下载均有效。

推理机的核心是一个规则引擎。它执行模式匹配,在执行动作中做出决策。RETE算法用于模式匹配。

知识被表述为规则。规则有两个主要部分:条件和动作。

例如:
如果用户(年龄>17),那么System.out.println("User is greater then 17");

在人工智能系统,主要有两种响应的方法。
1、正向链(Forward Chaining)
这是基于事实根据的。在工作区域检查中规则。当规则条件为真的规则不再有时,模式匹配结束。

2、反向链(Backward Chaining)
只检查规则的动作可以匹配目标的规则。如果满足条件,然后进行评估。

3、兼容JDK1.4,且需要下面的库。
(1) drools-all-jdk1.4.2.1.jar
(2) xercesImpl-2.6.2.jar
(3) antlr-2.7.5.jar
(4) janino-2.3.2.jar

4、代码示例(ApplyRule.java)
/*
  \* $Header$
  */

  package com.vivek.drools.example;

  import java.io.IOException;
  import java.io.InputStream;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.drools.FactException;
  import org.drools.IntegrationException;
  import org.drools.RuleBase;
  import org.drools.WorkingMemory;
  import org.drools.io.RuleBaseLoader;
  import org.xml.sax.SAXException;

  /**
  * Demonstration of a sample rule using Java.
  *
  * @version <tt>$Revision: 1.0 $</tt>
  * @author <a href="mailto:{vivek.tomar@naxos-software.de}" mce_href="mailto:{vivek.tomar@naxos-software.de}">{Vivek Tomar}</a>.
  */

  public class ApplyRule {

  // Constants -----------------------------------------------------

  static Log log = LogFactory.getLog(ApplyRule.class.getName());
  private static final String RULE_FILE = "/rules/rules.drl";
  //private static final String RULE_IS_TURNOVER_INSURABLE = "turnoverInsurable";
  //private static final String RULE_IS_TURNOVER_NOT_INSURABLE = "turnoverNotInsurable";

  // Attributes ----------------------------------------------------

  private double turnover = 1000000;

  // Constructors --------------------------------------------------

  public ApplyRule () {
  try {
  InputStream in = this.getClass().getResourceAsStream(RULE_FILE);
  RuleBase ruleBase = RuleBaseLoader.loadFromInputStream(in);
  WorkingMemory workingMemory = ruleBase.newWorkingMemory();
  workingMemory.assertObject(this);
  // Fire specific rule
  //workingMemory.fireAllRules(new RuleNameEqualsAgendaFilter(RULE_IS_TURNOVER_INSURABLE));

  //Fire all rules
  workingMemory.fireAllRules();
  } catch (IntegrationException e) {
  e.printStackTrace();
  } catch (FactException e) {
  e.printStackTrace();
  } catch (SAXException e) {
  e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }

  // Public --------------------------------------------------------

  public static void main (String args[]) {
  new ApplyRule();
  }

  public double getTurnover () {
  return turnover;
  }

  public void setTurnover (double turnover) {
  this.turnover = turnover;
  }

  public void printCompanyInsurable () {
  log.info("******************************");
  log.info("This company is Insurable.");
  log.info("******************************");
  }

  public void printCompanyNotInsurable () {
  log.info("==============================");
  log.info("This company is not Insurable.");
  log.info("==============================");
  }
  }


规则定义(rules.drl)
  <?xml version="1.0"?>
<rule-set name="cheese rules"
  xmlns="http://drools.org/rules"
  xmlns:java="http://drools.org/semantics/java"
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
  xs:schemaLocation="http://drools.org/rules rules.xsd
  http://drools.org/semantics/java java.xsd">
<rule name="turnoverInsurable">
<parameter identifier="applyRule">
<class>com.vivek.drools.example.ApplyRule</class>
</parameter>
<java:condition>applyRule.getTurnover() > 2000000 </java:condition>
<java:consequence>
  applyRule.printCompanyInsurable();
</java:consequence>
</rule>
<rule name="turnoverNotInsurable">
<parameter identifier="applyRule">
<class>com.vivek.drools.example.ApplyRule</class>
</parameter>
<java:condition>applyRule.getTurnover() < 2000000 </java:condition>
<java:consequence>
  applyRule.printCompanyNotInsurable();
</java:consequence>
</rule>
</rule-set>



三、JRuleEngine介绍
JRuleEngine是一个基于Java的规则引擎,遵循JSR94规范,版本1.1。

1、JRuleEngine共同特征:
(1) 在JRuleEngine输入对象被称为事实,而输出对象被称为结论。
(2) 一个类的方法可直接从规则中调用。

2、JRuleEngine基于前向链算法。

3、规则是类org.jruleengine.rule.RuleImpl的对象,它们以下列方式载入:
(1) 可以从XML文件中读入
(2) 通过RuleImpl对象创建,也可以取自数据库。

4、会话是客户端和规则引擎之间的运行时的胶水。会话与单一的规则执行集相关。会话规则的类型:
(1) 一个有状态的规则会话可持续很长时间,可一次又一次地查询。
(2) 一个无状态的规则给出了实现,但只能持续一定时期。

5、JRuleEngine需要两个库:
(1) jsr94.jar
(2) jruleengine.jar

6、添加这些文件到您应用程序的类路径。

7、通过实例化一个有状态的规则会话(StatefulRuleSession)或无状态的规则会话(StatelessRuleSession)来使用这个库。

8、代码例子(ApplyRule.java)
  /*
  * $Header$
  */
  package com.vivek.jruleengine.example;

  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;

  import javax.rules.RuleRuntime;
  import javax.rules.RuleServiceProvider;
  import javax.rules.RuleServiceProviderManager;
  import javax.rules.StatelessRuleSession;
  import javax.rules.admin.RuleAdministrator;
  import javax.rules.admin.RuleExecutionSet;

  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;

  /**
  * Demonstration of a sample rule using Java.
  *
  * @version <tt>$Revision: 1.0 $</tt>
  * @author <a href="mailto:{vivek.tomar@naxos-software.de}" mce_href="mailto:{vivek.tomar@naxos-software.de}">{Vivek Tomar}</a>.
  */
  public class ApplyRule {

  // Constants -----------------------------------------------------

  static Log log = LogFactory.getLog(ApplyRule.class.getName());
  private static final String RULE_FILE = "/rules/rules.xml";

  // Attributes ----------------------------------------------------

  private double turnover = 1000000;

  // Constructors --------------------------------------------------

  public ApplyRule () {

  try {
  // Load the rule service provider of the reference
  // implementation.
  // Loading this class will automatically register this
  // provider with the provider manager.
  Class.forName("org.jruleengine.RuleServiceProviderImpl");

  // Get the rule service provider from the provider manager.
  RuleServiceProvider serviceProvider = RuleServiceProviderManager.getRuleServiceProvider("org.jruleengine");

  // get the RuleAdministrator
  RuleAdministrator ruleAdministrator = serviceProvider.getRuleAdministrator();
  log.info("Administration API");
  log.info("======================");
  log.info("Acquired RuleAdministrator: ");

  // get an input stream to a test XML ruleset
  // This rule execution set is part of the TCK.
  InputStream inStream = this.getClass().getResourceAsStream(RULE_FILE);
   

  // parse the ruleset from the XML document
  RuleExecutionSet res1 =
  ruleAdministrator.getLocalRuleExecutionSetProvider(null).createRuleExecutionSet(inStream, null);
  inStream.close();
  log.info("Loaded RuleExecutionSet: ");

  // register the RuleExecutionSet
  String uri = res1.getName();
  ruleAdministrator.registerRuleExecutionSet(uri, res1, null);
  log.info("Bound RuleExecutionSet to URI: " + uri);

  RuleRuntime ruleRuntime = serviceProvider.getRuleRuntime();
  log.info("Acquired RuleRuntime: ");

  // create a StatelessRuleSession
  StatelessRuleSession statelessRuleSession = (StatelessRuleSession)
  ruleRuntime.createRuleSession(uri, new HashMap(),
  RuleRuntime.STATELESS_SESSION_TYPE);

  log.info("Got Stateless Rule Session: " + statelessRuleSession);

  // call executeRules with some input objects

  // Create a input list.
  List input = new ArrayList();
  input.add(this);

  // Print the input.
  log.info("Calling rule session with the following data");
  log.info("Customer turnover input: " + this.getTurnover());

  // Execute the rules without a filter.
  List results = statelessRuleSession.executeRules(input);

  // Release the session.
  statelessRuleSession.release();
  log.info("Released Stateless Rule Session.");

  } catch (NoClassDefFoundError e) {
  if (e.getMessage().indexOf("Exception") != -1) {
  log.error("Error: The Rule Engine Implementation could not be found.");
  } else {
  log.error("Error: " + e.getMessage());
  }
  } catch (Exception e) {
  e.printStackTrace();
  }
  }

  // Public --------------------------------------------------------

  public static void main (String args[]) {
  new ApplyRule();
  }

  public double getTurnover () {
  return turnover;
  }

  public void setTurnover (double turnover) {
  this.turnover = turnover;
  }

  public void printCompanyInsurable () {
  log.info("******************************");
  log.info("This company is Insurable.");
  log.info("******************************");
  }

  public void printCompanyNotInsurable () {
  log.info("==============================");
  log.info("This company is not Insurable.");
  log.info("==============================");
  }
  }


规则定义(rules.xml)
  <?xml version="1.0" encoding="UTF-8"?>
<rule-execution-set>
<name>RuleExecutionSet1</name>
<description>Rule Execution Set</description>
<synonymn name="applyRule" class="com.vivek.jruleengine.example.ApplyRule" />
<rule name="turnoverInsurable" description="Check if turnover insurable" >
<if leftTerm="applyRule.getTurnover" op=">" rightTerm="2000000" />
<then method="applyRule.printCompanyInsurable()" />
</rule>
<rule name="turnoverNotInsurable" description="Check if turnover not insurable" >
<if leftTerm="applyRule.getTurnover" op="<" rightTerm="2000000" />
<then method="applyRule.printCompanyNotInsurable" />
</rule>
</rule-execution-set>


结论:
Drools除了提供正常的规则引擎的能力,还有以下额外的优点:
(1) 无论是技术人士还是商业人士,Drools都是用户友好的,它提供了一个巨大的支持工具集。
(2) Drools的Reteoo算法可加速和可扩展。
(3) Drools提供的Eclipse插件带有自动完成智能感知和调试视图、规则流GUI等。
(4) 基于Web的工具(Guvnor):是一个业务规则管理系统(BRMS),它提供了高级规则授权、版本控制和管理。

至于其他的规则引擎,我个人建议在项目中使用Drools,因为它有一个很大的支持社区。在IDE支持和基于Web的规则管理工具(Guvnor)也有很大优势。

2
0
分享到:
评论

相关推荐

    规则引擎Drools在J2EE项目开发中的应用

    为了更好地理解和应用Drools,你可以阅读“规则引擎Drools在J2EE项目开发中的应用.pdf”这份文档,它将详细讲解如何在实际项目中集成和使用Drools,包括规则的编写、引擎的配置、以及与J2EE环境的交互等内容。...

    规则引擎Drools.NET移植版

    **规则引擎Drools.NET移植版** Drools是一款强大的业务规则管理系统,源自Java社区,以其灵活、高效和可扩展的特性而广受赞誉。它允许开发者将业务逻辑以规则的形式编写,使得业务规则可以独立于应用程序代码进行...

    Drools规则引擎使用demo

    Drools是一款强大的规则引擎,由Red Hat公司开发并维护,它主要用于实现业务规则的管理和执行。Drools提供了一种声明式的方式来定义业务规则,使得非技术人员也能理解和修改规则,从而降低了业务逻辑与代码的耦合度...

    Drools 规则引擎的介绍及应用

    ### Drools规则引擎的介绍及应用 #### 一、规则引擎概述 规则引擎是一种软件系统,用于执行基于预定义规则的决策逻辑。这些规则通常表示为业务规则,旨在模拟人类专家在解决特定问题时所遵循的逻辑过程。规则引擎...

    java规则引擎Drools基础

    Java规则引擎Drools是基于Java平台的企业级规则引擎,它允许开发者以声明式的方式定义业务规则,并在运行时高效地执行这些规则。Drools是JBOSS的一个开源项目,广泛应用于金融、保险、电信等领域,用于实现复杂的...

    规则引擎Drools入门实战案例

    1、业务规则与系统代码分离,实现业务规则的集中管理 2、在不重启服务的情况下可随时对业务规则进行扩展和维护 3、可以动态修改业务规则,从而快速响应需求变更 4、规则引擎是相对独立的,只关心业务规则,使得...

    drools规则引擎系统概要设计说明书

    2. 集成Drools:在JBoss应用服务器中集成Drools规则引擎可以使得业务规则的管理更加灵活和强大。通过集成,JBoss应用服务器可以利用Drools来处理复杂的业务逻辑。 3. JBoss Drools项目:JBoss Drools项目是一个提供...

    Drools规则引擎从入门到精通

    【Drools规则引擎从入门到精通】 Drools是一个强大的业务规则管理系统,它提供了业务规则引擎、Web创作工具(Drools Workbench)以及决策模型符号(DMN)的支持。作为一个开源项目,Drools使用Java编写,遵循Apache...

    Drools规则引擎介绍

    Drools的核心是基于 RETE 算法的推理引擎,能够高效地处理大量规则的执行。 1. **Drools概述**: Drools由Jboss社区开发,是Red Hat公司的产品。它提供了全面的规则引擎功能,包括规则的编写、测试、部署和执行。...

    java规则引擎 -- Drools

    Java规则引擎Drools是一个强大的业务规则管理系统,它允许开发者将业务逻辑以规则的形式分离出来,使得业务决策能够独立于应用程序代码,易于维护和更新。Drools是基于模型驱动的,采用领域特定语言(DSL)来表达...

    Drools6.3规则引擎(java)

    1. **规则引擎**:Drools 的核心是其规则引擎,它能够解析和执行由Drools特定语法(如DRL)编写的规则。这些规则可以是简单的if-then语句,也可以是复杂的逻辑链,用于在满足特定条件时触发操作。规则引擎的执行模型...

    Java规则引擎---Drools的介绍及应用

    ### Java规则引擎——Drools的深度解析与应用探索 #### 一、规则引擎与基于规则的专家系统 规则引擎,作为软件开发领域的一项关键技术,其核心在于模仿人类的决策过程,通过预定义的规则集对输入数据进行分析,...

    Drools规则引擎开发实例+源码

    Drools规则引擎是一款强大的开源规则引擎,广泛应用于业务决策逻辑和复杂事件处理。它基于Java平台,由JBOSS组织维护,支持基于 declarative 的规则编写方式,使得非程序员也能理解和修改规则,大大提升了业务规则的...

    drools7.25中文文档+drools技术指南.zip

    1. **Drools概述**:这部分将介绍Drools的基本概念,包括什么是规则引擎,为什么需要规则引擎,以及Drools在业务流程中的作用。它会阐述Drools如何帮助开发者将业务逻辑从核心应用程序中分离出来,实现灵活的、可...

    drools整合apollo实现动态规则引擎

    drools整合apollo实现动态规则引擎,可以在不停服的情况下动态调整规则。无需数据库等存储,自动推送

    Java规则引擎-Drools的介绍及应用-刘伟.pdf

    Drools的规则引擎可以与Java集成,提供了一个强大的规则引擎解决方案。 三、规则引擎的实现原理 规则引擎的实现原理基于生产规则系统(Production Rule System)。生产规则系统是基于规则的专家系统的一种,它可以...

    droolsdroolsdrools

    1. 规则引擎:Drools的核心是规则引擎,它负责执行存储在知识库中的规则。规则由条件(if部分)和动作(then部分)组成,当条件满足时,相应的动作被执行。 2. 知识库(Knowledge Base):Drools中的知识库包含了...

    Drools5规则引擎开发文档

    ### Drools5规则引擎开发文档知识点详解 #### 一、Drools5规则引擎简介 Drools是一款基于Java的开源规则引擎,广泛应用于业务逻辑处理领域,它可以帮助开发者快速地构建灵活且复杂的业务规则系统。Drools支持多种...

    规则引擎Drools使用手册(中文)

    ### 规则引擎Drools使用手册:4.0版更新要点详解 #### 一、Drools 4.0新特性概览 Drools 4.0是一次重要的更新,相较于之前的Drools 3.0.x系列,在语言表达、引擎性能以及工具实用性等方面都有显著提升。以下为此次...

    规则引擎drools实例

    8. **学习与开发**:对于想要学习Drools的开发者,可以从阅读`README_DEPENDENCIES.txt`开始,了解项目依赖,然后通过`drools-examples`中的示例逐步掌握规则的编写和执行。同时,Drools的官方文档和社区资源也是...

Global site tag (gtag.js) - Google Analytics