`
xyhsm
  • 浏览: 20034 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

规则引擎—— 实例应用指南

阅读更多

 

本文给出了如何利用Drools来执行业务规则实例。


考虑这样一种情况,某 学校USST希望招收的学校其年龄应该大于15岁,另外一个学校FUDAN希望其招收的学生大于18岁.当然,不同的学校对学生的要求可能不一样,例如年 龄、性别、成绩等。如果采用大量的if...else语句写在业务逻辑层,将来随着学校招生的要求变化,需要应用程序开发人员,不断的修改业务规则。现在 考虑采用Drools来使商务逻辑从应用程序中分离出来。

1。首先设计一个Student类,包括姓名、年龄、性别、希望就读学校。类文件如下:

package com.primeton.juxtapose.rule.example;

/**
* 简单的JavaBean保存student值。用于存放与学生相关的信息。
* 包括 姓名、年龄、性别、是否推荐入学等。
*
* 根据学生的性别、年龄等判断该学生是否可以入读某一学校。
* 如: 某女子学校可能只接受性别为女的学生;
* 某学校可能只接受年龄大于15岁的学生入学;
* 某女子学校可能只接受性别为女且年龄大于18岁的学生入学;
* ......
*
* @author liuxiang
*
*/
public class Student {
//常量
public final static String YES="YES";
public final static String NO="NO";

//内部变量
private String studentName =null;
private int studentAge = 0;
private String studentSex = null;
private String recommend = null;
private String schoole = null;

/**
* 设置学生姓名
* @param studentName
*/
public void setStudentName(String studentName){
this.studentName = studentName;
}
/**
* 获得学生姓名
* @return
*/
public String getStudentName(){
return this.studentName;
}
/**
* 设置学生年龄
* @param studentAge
*/
public void setStudentAge(int studentAge){
this.studentAge = studentAge;
}
/**
* 获得学生年龄
* @return
*/
public int getStudentAge(){
return this.studentAge;
}
/**
* 设置学生性别
* @param studentSex
*/
public void setStudentSex(String studentSex){
this.studentSex = studentSex;
}
/**
* 获得学生性别
* @return
*/
public String getStudentSex(){
return this.studentSex;
}
/**
* 设置是否推荐入学
* @param recommend
*/
public void setRecommend(String recommend){
this.recommend = recommend;
}
/**
* 获得是否推荐入学
* @return
*/
public String getRecommend(){
return this.recommend;
}
/**
* 设置孩子希望就读的学校
* @param schoole
*/
public void setSchoole(String schoole){
this.schoole = schoole;
}
/**
* 获得孩子希望就读的学校
* @return
*/
public String getSchoole(){
return this.schoole;
}
}

2。对于业务逻辑考虑用一个简单得Java类来实现,用来模拟执行商业逻辑。类BusinessLogicLayer,用于模拟商业逻辑的执行。

package com.primeton.juxtapose.rule.example;

import java.io.IOException;
import org.drools.DroolsException;
import org.drools.IntegrationException;
import org.drools.RuleBase;
import org.drools.WorkingMemory;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.io.RuleBaseLoader;
import org.drools.spi.Activation;
import org.drools.spi.AgendaFilter;
import org.xml.sax.SAXException;

/**
* 一个简单的业务逻辑层,用来模拟商业逻辑。
*
* @author liuxiang
*
*/
public class BusinessLogicLayer {
private static final String BUSINESS_RULE_FILE="BusinessRulesStudent.drl";
private static RuleBase businessRules = null;

// 设置过滤条件, 名称为"FemaleSchoole"的规则将不会被执行。
private static AgendaFilter filter = new AgendaFilter(){
public boolean accept(Activation activation){
if (activation.getRule().getName().equals("Stude")){
return false;
}
return true;
}
};

/**
* 如果还没有装载商务规则的话就装载它。
* @throws IOException
* @throws SAXException
* @throws IntegrationException
*@抛出异常 -通常从这里恢复
*/
private static void loadRules() throws IntegrationException, SAXException, IOException {
if (businessRules==null){
businessRules = RuleBaseLoader.loadFromUrl(com.primeton.juxtapose.rule.example.BusinessLogicLayer.class.getResource(BUSINESS_RULE_FILE ) );
}
}
/**
* 评价学生是否能够入学
* @param stockToBuy
* @throws Exception
*/
public static void evaluateStudentRecommend(Student student) throws Exception{
loadRules();
System.out.println( "FIRE All RULES" );
System.out.println( "------------------------------------------------------------" );
WorkingMemory workingMemory = businessRules.newWorkingMemory();
workingMemory.addEventListener(new DebugWorkingMemoryEventListener());
workingMemory.assertObject(student);
workingMemory.fireAllRules(filter);
}

/**
* 测试用例
* 测试学生juxtapose就读USST学校 是否符合条件
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
//BusinessLayer businessLayer = new BusinessLayer();
Student student = new Student();
student.setSchoole("USST");
student.setStudentName("juxtapose");
student.setStudentAge(20);
student.setStudentSex("Male");
BusinessLogicLayer.evaluateStudentRecommend(student);
}
}

3。 在该类的运行时需要用到规则的定义,采用XML的方式来描述商务逻辑中用到的各种规则。规则文件BusinessRulesStudent.drl的定义如下:

<!---->
<rule-set name="BusinessRulesSample"></rule-set>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">

<java:import>java.lang.Object </java:import>
<java:import>java.lang.String </java:import>
<java:import>com.primeton.juxtapose.rule.example.Student </java:import>

<java:functions>
public static void printStudent(com.primeton.juxtapose.rule.example.Student student){
System.out.println(" Student Name:"+student.getStudentName()
+"n Sudent Age: "+student.getStudentAge()
+"n Student Sex:"+student.getStudentSex()
+"n Recommend "+student.getStudentName()
+" to go to schoole "
+student.getSchoole()
+": "
+student.getRecommend());
}
</java:functions>


<rule name="USSTSchoole" salience="-1"></rule>
<parameter identifier="student"></parameter>
<class></class>com.primeton.juxtapose.rule.example.Student


<java:condition>student.getSchoole().equals("USST") </java:condition>
<!---->
<java:condition>student.getStudentAge() > 15 </java:condition>

<!---->
<java:consequence>
student.setRecommend(Student.YES);
printStudent(student);
</java:consequence>


<rule name="FUDANSchoole" salience="-1"></rule>
<parameter identifier="student"></parameter>
<class></class>com.primeton.juxtapose.rule.example.Student


<java:condition>student.getSchoole().equals("FUDAN") </java:condition>
<!---->
<java:condition>student.getStudentAge() > 18 </java:condition>

<!---->
<java:consequence>
student.setRecommend(Student.YES);
printStudent(student);
</java:consequence>

在该规则文件中共设置了两个规则,其规则名分别为USSTSchoole、FUDANSchoole,前者用于执行就读USST学校的规则设置,其条件为:

就读学校为 USST,学生年龄大于15岁,推荐就读变量为null; 后者FUDANSchoole规则用于执行就读FUDAN学校的规则设置,其条件为:

就读学校为 FUDAN,学生年龄大于8岁,推荐就读变量为null;

4。利用Junit进行测试。测试类BusinessLogicLayerTest.java包含两个测试方法,分别用于执行就读USST和FUDAN学校的测试。

package com.primeton.juxtapose.rule.example;

import junit.framework.TestCase;

/**
* 商务逻辑的单元测试,
* 用于检测我们的业务规则是否得到了正确的执行。
*
* @author liuxiang
*
*/
public class BusinessLogicLayerTest extends TestCase {
/**
* 测试学生juxtapose就读USST学校 是否符合条件
* @throws Exception
*/
public void testGotoUSST() throws Exception{
//创建一个学生实例,目标就读学校为USST
Student student = new Student();
student.setSchoole("USST");
student.setStudentName("juxtapose");
student.setStudentAge(16);
student.setStudentSex("Male");

//运行规则
BusinessLogicLayer.evaluateStudentRecommend(student);

//测试该学生能够入学 符合规则中设定的条件
//assertTrue(student.getRecommend() != null);
assertTrue("YES".equals(student.getRecommend()));
}

public void testGotoFUDAN() throws Exception{
//创建一个学生实例,目标就读学校为USST
Student student = new Student();
student.setSchoole("FUDAN");
student.setStudentName("jxta");
student.setStudentAge(20);
student.setStudentSex("Male");

//运行规则
BusinessLogicLayer.evaluateStudentRecommend(student);

//测试该学生能够入学 符合规则中设定的条件
//assertTrue(student.getRecommend() != null);
assertTrue("YES".equals(student.getRecommend()));
}
}

5。执行结果。

FIRE All RULES
------------------------------------------------------------ Student Name:juxtapose
Sudent Age: 16
Student Sex:Male
Recommend juxtapose to go to schoole USST: YES
FIRE All RULES
------------------------------------------------------------
Student Name:jxta
Sudent Age: 20
Student Sex:Male
Recommend jxta to go to schoole FUDAN: YES

6。结论

利用Drools可以轻松的在系统上线后,通过执行规则的替换、增加、修改。使得商务逻辑从应用程序中分离出来,大幅度的提高了系统的柔韧性、适应性,满足了日益变化的市场需求。

 

分享到:
评论
1 楼 nounit 2010-02-21  
drools通过xml描述业务规则,意味着开发人员要学习新的业务描述语言,为什么不直接使用java类 来代替xml文件,通过一个java框架来管理呢,这样学习和调试,要方便的多,而且省略了xml文件的读取和解析。
另外更新规则xml文件可以不重启服务器么?

相关推荐

    ASP论坛网站实例开发源码——phpBB 3.0 Beta2 汉化版实例开发.rar

    【ASP论坛网站实例开发源码——phpBB 3.0 Beta2 汉化版实例开发】 本资源是基于ASP的论坛网站实例开发源码,采用的是phpBB 3.0 Beta2的汉化版本。phpBB是一款全球知名的开源论坛软件,以其功能强大、易于定制和管理...

    PHP论坛社区类网站实例开发源码——Google Sitemap生成器.zip

    它为搜索引擎爬虫提供了一个清晰的指南,帮助它们更快更有效地遍历和理解网站结构。对于大型或动态更新频繁的网站,如论坛社区,拥有一个有效的Sitemap至关重要。 Google Sitemap生成器的核心功能包括: 1. **自动...

    iOS实例开发源码——JohnnySheng-SpaceGame-c2342f0.zip

    《iOS实例开发源码——JohnnySheng-SpaceGame-c2342f0》 这个压缩包中的内容是一个名为"JohnnySheng-SpaceGame-c2342f0"的iOS游戏开发实例,由开发者JohnnySheng创作。这个游戏实例为我们提供了一个深入理解iOS应用...

    工作流引擎笔记

    我们还将通过阅读名为"jbpmѧϰ.doc"的文档来获取关于Jbpm——一个流行的工作流引擎——的详细信息。 工作流引擎的核心功能包括流程设计、流程实例管理、任务分配和监控。流程设计通常使用可视化工具,如BPMN(业务...

    iOS实例开发源码——jmullen-Brain-Game-47bc418.zip

    8. **GameplayKit**: 如果这是一个游戏项目,GameplayKit可能被用来实现游戏逻辑,包括AI、规则引擎和随机数生成。 9. **SpriteKit**: 专门用于2D游戏开发的框架,提供动画、物理模拟等功能。 10. **AVFoundation*...

    ASP网站整站程序源码——MyTopix v1.3.0简体中文版实例开发.zip

    7. **文档**:可能包含安装指南、使用手册或开发者文档,帮助用户理解和使用程序。 通过分析和学习MyTopix v1.3.0的源码,你可以掌握以下知识点: 1. **ASP基础语法**:了解VBScript或JScript的基本语法规则,如何...

    jBPM4工作流应用开发指南

    《jBPM4工作流应用开发指南》是针对企业级业务流程管理(Business Process Management,简称BPM)的一款开源框架——jBPM4的详细教程。jBPM4是一款强大的工作流引擎,它允许开发者设计、执行、管理和监控业务流程,...

    drools入门指南(基于drools6.2).pdf

    为了测试上述规则,需要编写一个简单的Java程序,该程序负责实例化`Message`对象,并将其插入到Drools规则引擎的Working Memory中。接着,执行规则引擎的`fireAllRules()`方法来触发匹配的规则。 通过以上步骤,...

    sql server安装指南

    文档提及了SQL Server 2012的两个特定版本——Developer Edition和Express Edition,并说明了这两种版本的安装指南,但同样适用于SQL Server 2008和2012家族的其他版本。 安装SQL Server的第一步通常是下载安装程序...

    jbpm4.0用户指南(中文版)

    Drools是一个规则引擎,可以方便地管理和执行复杂的业务规则。 4. **持久化**:jbPM4.0利用Hibernate进行数据持久化,确保流程实例和相关数据能够在系统重启后恢复。 5. **事件处理**:系统支持事件驱动的流程,...

    PHP实例开发源码-进云jys系统应用开发框架.zip

    在压缩包中,“使用须知.txt”文件很可能是框架的使用指南,包含如何安装、配置及运行jys框架的详细步骤。这份文档对于初学者来说至关重要,因为它提供了开始使用框架的必要信息,包括环境需求、安装方法、配置文件...

    Jess In Action

    本书不仅适合于对规则引擎有基础了解的开发者,也适合那些希望深入了解Jess——一个开源的、功能强大的Java规则引擎的读者。 ### 标题解读:“Jess in Action” “Jess in Action”直译为“Jess在行动”,这里的...

    droolsguide.rar

    本教程——"Drools技术指南",将帮助你深入理解Drools的原理与应用。 首先,我们要了解什么是业务规则。业务规则是企业中定义业务流程或决策的逻辑,通常涉及条件判断和动作执行。Drools通过使用规则语言(DRL)来...

    net游戏编程源入门经典——C#篇源代码

    在物理引擎方面,虽然.NET框架可能不直接提供物理模拟的库,但书中可能会介绍如何使用第三方库如Box2D.NET或者自行实现简单的物理规则,如碰撞检测和物体运动。这些技术可以让游戏中的物体具有真实的动态行为。 ...

    JBPM4工作流应用开始指南.rar

    195 第9章 jBPM4扩展研发先决条件 196 9.1 深入应用jBPM4所需要知道的 196 9.1.1 如果您的业务基于复杂的规则,在jBPM中加入Drools吧 196 9.1.2 抉择,是否使用BPEL 197 9.2 Maven仓库和Java依赖库 199 9.3 小结 200...

    PHP实例开发源码—熊海php博客.zip

    1. 使用须知.txt:这可能是包含关于如何正确使用、安装或运行这个博客系统源代码的指南。通常,这样的文件会提供一些基本的步骤,如设置环境、导入数据库结构、配置文件修改等,以确保用户能够顺利运行示例项目。 2...

    数学建模好资料——模糊数学

    外文.pdf可能包含了关于模糊数学的深入理论探讨和应用案例,而模糊数学这个文件可能是更具体的操作指南或实例分析。学习和掌握模糊数学,不仅有助于提升数学建模的能力,还能在解决实际问题时提供强大的理论支持和...

    drools runtime所需zip包

    Drools是一个强大的规则引擎,它是Java平台上的一个开源项目,用于实现复杂的业务规则管理。在本场景中,"drools runtime所需zip包"是指Drools运行时环境的压缩包,它包含了运行Drools Engine所必需的库文件和其他...

    .net版本语音识别实例源码--201903

    本实例源码——".net版本语音识别实例源码--201903",是基于C#的一个项目,旨在帮助开发者了解并实现语音识别功能。在2019年3月时,该技术可能已经相当成熟,但随着微软的持续更新,如今的.NET框架(如.NET Core或...

Global site tag (gtag.js) - Google Analytics