`

Java Drools5.1 规则流基础【示例】

 
阅读更多
一、问题描述



假设雇员Employ有:

           学历信息 eduInfo,   简历信息  resume,

           考核信息 annualExam  和奖惩信息 awardPunish;

要确定其:

           基本工资 basicSalary, 职务工资 dutySalary,

           分红金额 bonus 和 总工资 totalSalary.



规则如下:

【1】学历决定基本工资(basicSalary):

                       ====>本科1500研究生2500

【2】简历决定职务工资(dutySalary) :

                       ====>技术2000管理4500

【3】年度考核决定分红(bonus):

                       ====>分红总金额1000

                       ==>考核结果:

                        ==>优秀100%(1000);良好90%(900);

                                       合格60%(600); 不合格0%(0);

【4】奖惩决定计算最终工资与【123】项工资之和的比例:

                       ====>奖励:*110%(+10%)

                       ====>惩罚:*90%(-10%)

                       ====>无:*100%(0%)

【5】计算总工资: (【1】+【2】+【3】)*【4】



二、问题分析



1.基本流程:



P【计算基本工资,计算职务工资,计算分红, 计算奖惩比例】

                    ====>计算总工资(根据奖惩情况)

其中,P[i,...,k]表示任务i,...,k并发执行,====>表示顺序执行。

即有:P[1,2,3, 4] ===> 5



三、概要设计



【1】类Employ的设计:

【2】规则文件的编写和组织:

                ==>学历规则文件:EduInfoRule.drl

                ==>简历规则文件:ResumeRule.drl

                ==>分红规则文件:BonusRule.drl

                ==>奖惩规则文件:AwardPunish.drl

                ==>计算总工资规则:TotalRule.drl

【3】规则文件的组合(规则流):



                 ==>EduInfo.drl含规则组basic_salary

                 ==>ResumeRule.drl含规则组duty_salary

                 ==>BonusRule.drl含规则组bonus_salary

                 ==>AwardPunish.drl含规则组award_punish

                  ==>TotalRule.drl含规则组sum_salary



组合方式:

[start]--->  P[basic_sal ary , duty_salary, bonus_salary, award_punish]

                  --->sum_salary ---> [end]





其中:P表示并发,--->表示顺序 【规则流图在后面的实现中给出】



【4】编写测试文件:EmployTest.java


四、详细设计



【1】使用EclipseIDE作为开发环境,drools5.1作为规则引擎

【2】为简单起见,Employ类的属性作了简化处理,

             eduInfo, resume , annualExam,   awardPunish均为String,

                   basic{duty,bonus,total}_salary , percent作为double类型。

五、规则文件及规则流



              EduInfoRule.drl:
package myrules;
import sample.Employ;
 
rule"Bachelor"
      ruleflow-group"basic_salary"
when
   emp:Employ(eduInfo =="bachelor");
then
   System.out.println("execrule Bachelor ... ");
   emp.setBasicSalary(1500);
end

rule"Master"
      ruleflow-group"basic_salary"
when
   emp:Employ(eduInfo=="master")
then
   System.out.println("execrule Master ... ");
   emp.setBasicSalary(2500);
end


Resume.drl
package myrules
import sample.Employ;

rule"Technician"
       ruleflow-group"duty_salary"
when
   emp:Employ(resume=="tech")
then
   System.out.println("execrule Technician ... ");
  emp.setDutySalary(2000);
end

rule"Manager"
      ruleflow-group"duty_salary"
when
   emp:Employ(awardPunish=="manager")
then
   System.out.println("execrule manager ... ");
   emp.setDutySalary(4500);
end


BonusRule.drl 
package myrules
import sample.Employ;

rule"Excellent"
      ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="excellent")
then
   System.out.println("execrule Excellent ... ");
  emp.setBonus(1000*1.0);
end

rule"Good"
       ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="good")
then
   System.out.println("execrule Good ... ");
  emp.setBonus(1000*0.9);
end

rule"Common"
      ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="common")
then
   System.out.println("execrule Common ... ");
  emp.setBonus(1000*0.6);
end

rule"failing"
       ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="failing")
then
   System.out.println("execrule failing ... ");
  emp.setBonus(1000*0.0);
end


AwardPunish.drl 

packagemyrules
importsample.Employ;

rule"Award"
       ruleflow-group"award_punish"
when
   emp:Employ(awardPunish=="award")
then
   System.out.println("execrule Award ... ");
  emp.setPercent(1.10);
end

rule"Punishment"
       ruleflow-group"award_punish"
when
   emp:Employ(awardPunish=="punish")
then
   System.out.println("execrule Punishment ... ");
  emp.setPercent(0.90);
end

rule"None"
      ruleflow-group"award_punish"
when
   emp:Employ(awardPunish=="none")
then
   System.out.println("execrule None ... ");
  emp.setPercent(1.00);
end


TotalRule.drl

package myrules
import sample.Employ;

rule"Total"
  ruleflow-group"sum_salary"
when
   emp: Employ()
then
   System.out.println("execrule Total ... ");
   double total =emp.getBasicSalary() + emp.getDutySalary() +
                 emp.getBonus();                               
   emp.setTotalSalary(total*emp.getPercent());
end






注意:

       [1]Split结点类型为OR,约束选择alwaystrue.表示选择其规则组中所有符合事实的规则进行并发执行;

       [2] Join结点类型为AND,表示当且进当上述规则组均执行完毕后,才执行后面的规则或进程。




六、测试代码:



Employ:
package sample;

public class Employ {
	
	public static final double BONUS = 1000;
	
	private String eduInfo;
	private String resume;
	private String annualExam;
	private String awardPunish;
	
	private double basicSalary;
	private double dutySalary;
	private double bonus;
	private double percent;
	
	private double totalSalary;
    
	public String getEduInfo() {
		return eduInfo;
	}
	public void setEduInfo(String eduInfo) {
		this.eduInfo = eduInfo;
	}
	public String getResume() {
		return resume;
	}
	public void setResume(String resume) {
		this.resume = resume;
	}
	public String getAnnualExam() {
		return annualExam;
	}
	public void setAnnualExam(String annualExam) {
		this.annualExam = annualExam;
	}
	public String getAwardPunish() {
		return awardPunish;
	}
	public void setAwardPunish(String awardPunish) {
		this.awardPunish = awardPunish;
	}
	
	public double getBasicSalary() {
		return basicSalary;
	}
	public void setBasicSalary(double basicSalary) {
		this.basicSalary = basicSalary;
	}
	
	public double getDutySalary() {
		return dutySalary;
	}
	public void setDutySalary(double dutySalary) {
		this.dutySalary = dutySalary;
	}

	public double getBonus() {
		return bonus;
	}
	public void setBonus(double bonus) {
		this.bonus = bonus;
	}
	
	public double getPercent() {
		return percent;
	}
	public void setPercent(double percent) {
		this.percent = percent;
	}
	
	public double getTotalSalary() {
		return totalSalary;
	}
	public void setTotalSalary(double totalSalary) {
		this.totalSalary = totalSalary;
	}
    
    public String toString() {
    	return "[" + eduInfo + " " + resume + " " + annualExam + " " +
    	             awardPunish + " " + basicSalary + " " + dutySalary + " " +
    	             bonus + " " + totalSalary + "]";   
    }
    
}


EmployTest:
package sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

public class EmployTest {
	
	public static void main(String[] args) {
		
		try {
			// load up the knowledge base
			KnowledgeBase kbase = readKnowledgeBase();
			StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
			KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
			// go !
			Employ emp = new Employ();
			emp.setEduInfo("master");
			emp.setResume("tech");
			emp.setAnnualExam("good");
			emp.setAwardPunish("award");
			ksession.insert(emp);
			ksession.startProcess("myrules.salary");
			ksession.fireAllRules();	
			System.out.println("Basic Salary: " + emp.getBasicSalary());
			System.out.println("Duty Salary: " + emp.getDutySalary());
			System.out.println("Bonus      : " + emp.getBonus());
			System.out.println("rate       : " + emp.getPercent());
			System.out.printf("Total Salary: %.0f" , emp.getTotalSalary());
			logger.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}			
		
	}
		
	private static KnowledgeBase readKnowledgeBase() throws Exception {
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory.newClassPathResource("rules/EduInfoRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/ResumeRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/BonusRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/AwardPunish.drl"), ResourceType.DRL);
	    kbuilder.add(ResourceFactory.newClassPathResource("rules/TotalRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/salary.rf"), ResourceType.DRF);
		KnowledgeBuilderErrors errors = kbuilder.getErrors();
		if (errors.size() > 0) {
			for (KnowledgeBuilderError error: errors) {
				System.err.println(error);
			}
			throw new IllegalArgumentException("Could not parse knowledge.");
		}
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
		return kbase;
	}	

}


测试结果:

               execrule Technician ...

           execrule Master ...

execrule Good ...

execrule Award ...

execrule Total ...

BasicSalary: 2500.0

DutySalary: 2000.0

Bonus : 900.0

rate : 1.1

TotalSalary: 5940





七、总结




Javadrools规则流基础:




【1】掌握规则引擎的基本工作原理;

【2】掌握规则文件的编写;

【3】掌握规则流图的绘制及应用程序集成。

【4】掌握规则组合的两种基本方式【并发和顺序】的实现方式。




下一步:




【1】更复杂的规则组合;

【2】规则文件的组织、管理;

【3】规则文件的自动生成;

【4】用户自定义规则;



NOTE:  关于XP下的示例作了一些修改,主要增加了XML格式的规则流文件及一个简单的自动生成顺序规则流的方法。已经上传至CSDN下载,请在下面网址下载:http://download.csdn.net/source/3462802 
  • 大小: 30.6 KB
  • 大小: 417.2 KB
分享到:
评论

相关推荐

    drools5.1 规则流示例

    本示例旨在演示如何在Drools 5.1中使用规则流(Rule Flow)进行复杂的业务流程管理。规则流是Drools提供的一种工具,它允许用户通过图形化方式定义规则执行的顺序和条件,从而更好地控制业务逻辑的执行流程。 首先...

    drools5.1_开发中文文档

    《Drools 5.1 开发中文文档》是一份详尽的指南,专注于Drools这一开源规则引擎的最新版本。Drools是一个强大的业务规则管理和决策支持系统,其5.1版本引入了多项改进和增强,旨在提高灵活性、性能和易用性。 在介绍...

    Drools 规则流的使用介绍

    Drools 是一个开源的业务规则管理系统(BRMS),它基于Java平台,提供了强大的规则引擎和规则流(Workflow)功能。这篇文章将深入探讨Drools如何实现规则流,以及如何在实际项目中有效应用。 ### 一、Drools 概述 ...

    Drools5.1 Expert 用户指南_中文

    Drools正是在此基础上,通过采用规则驱动的方法,优化并扩展了专家系统的功能,成为一种更先进的生产规则系统。 #### 生产规则系统与业务规则管理 生产规则系统是一种特定类型的规则引擎,其核心在于使用一阶逻辑...

    jboss drools5.5 规则流完整代码

    **JBoss Drools 5.5 规则流完整代码详解** JBoss Drools 是一个开源的业务规则管理系统(BRMS),它允许开发者通过规则语言(如DRL)来定义和执行业务规则。在5.5版本中,Drools 提供了强大的规则流(Rule Flow)...

    drools5 规则动态加载示例

    在这个"drools5 规则动态加载示例"中,我们将探讨如何在不重启服务的情况下,实现规则的热更新,即动态加载修改后的规则文件,使得业务逻辑能够实时适应变化。 在传统的软件开发中,一旦应用部署,若需更改业务规则...

    Drools规则流

    本文将围绕Drools 6版本中的规则流部分进行深入探讨,详细介绍其工作原理、配置方法及示例应用。 #### 二、规则流概念 规则流(Rule Flow)是Drools中用于定义规则执行顺序的一种机制,它通过图形化的方式展现规则...

    Java Drools Demo

    在这个Demo中,可能会有各种各样的示例规则和相应的触发条件,以展示Drools的灵活性和强大功能。此外,Drools还提供了事件处理和复杂的事件处理(CEP)功能,可以用来处理实时事件流。 总的来说,"Java Drools Demo...

    Drools规则引擎实现示例

    通过这个"JerryDroolsTest"示例,你可以了解到Drools如何与Java代码集成,以及如何定义、加载和执行业务规则。这只是一个基础的示例,实际项目中可能涉及规则的组织、优化、并发执行等多个方面,都需要深入学习和...

    Drools规则引擎实现原理及示例

    Drools规则引擎是一种嵌套在应用程序中的组件, 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。 它实现了将业务规则从程序代码忠分离出来,规则引擎使用特定的语法编写业务规则,规则引擎...

    drools动态生成规则文件

    drools动态生成规则文件是基于Java的业务规则管理系统,它允许开发者在运行时创建、修改和执行业务规则。 Drools是Red Hat JBoss BRMS(Business Rules Management System)的一部分,它提供了一种强大的规则引擎,...

    Drools5规则引擎开发教程

    Drools是Java平台上的一个开源规则引擎,它允许开发者以声明式的方式编写业务规则,从而将复杂的逻辑从应用程序中分离出来,提高了代码的可读性和维护性。 Drools的核心概念包括规则(Rule)、工作内存(Working ...

    Drools_规则引擎详解

    Drools 规则引擎是基于 Java 的开源规则引擎,由 JBoss 发布。作为一个业务规则管理系统(BRMS),Drools 提供了一个基于规则的系统,用于定义、执行和管理业务规则。Drools 的主要功能是将业务规则与应用程序逻辑...

    Drools5规则引擎学习研究

    创建你的第一个Drools项目,步骤包括:创建Drools Project,输入项目名称,选择创建规则文件和规则Java类,指定Drools版本,最后运行`DroolsTest`来查看效果。 在Drools中,规则的编译、收集和执行通过API进行。`...

    Drools规则执行顺序

    Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景。 在 Drools 中,规则的执行顺序主要由以下因素决定: 1. **规则优先级**:...

    java规则引擎Drools基础

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

    drools-规则语言

    Drools的核心是一个高性能的规则引擎,它支持决策表、流程管理等功能,并且能够很好地与Java应用程序集成。 #### 二、Rete算法详解 Rete算法是一种高效的模式匹配算法,由Charles L. Forgy在1974年提出。这一算法...

    Drools规则引擎使用demo

    Drools是一款强大的规则引擎,由Red ...通过这个"Drools规则引擎使用demo",你可以学习如何配置、加载规则,以及如何在Java应用程序中使用Drools进行规则的执行和事实的管理。这将为你构建智能决策系统提供坚实的基础。

    java规则引擎 -- Drools

    Java规则引擎Drools是一种强大的业务规则管理系统,它允许开发者将复杂的业务逻辑以规则的形式分离出来,便于管理和维护。Drools是基于Model Driven Architecture(MDA)的,它支持RuleML和Business Rule Markup ...

    基于Java注解的Drools业务规则开发框架设计实现.pdf

    Drools是一个基于Java语言的开源业务规则管理系统(BRMS),它允许业务专家或开发者以规则脚本的形式编写业务逻辑,并能够即时在线上环境中对规则进行修改而无需重启应用。Drools提供了自己的规则定义语言(DRL),...

Global site tag (gtag.js) - Google Analytics