- 浏览: 122357 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (131)
- J2EE (5)
- 系统配置 (2)
- eclipse (3)
- MySQL (3)
- 数据库 (1)
- log4j (2)
- hibernate (5)
- JBOSS (3)
- https (2)
- Struts2 (7)
- javascript (2)
- CSS (4)
- HTTP (2)
- J2SE (1)
- apache (6)
- XML (1)
- android (3)
- session (3)
- Spring (3)
- 前端优化 (2)
- Drools (2)
- java笔试题 (8)
- SVN (2)
- linux (19)
- linux命令 (3)
- memcache (1)
- Servlet (2)
- Java RMI (1)
- 领域模型 (1)
- LVS (4)
- Linux shell (2)
- WEB (1)
- F5 (2)
- WinRAR (1)
- TCP (1)
- MQ (2)
- weblogic (1)
- winxp安装FTP (1)
- WebLogic和Tomcat (1)
- 虚拟机 (1)
- nexus-maven (1)
- jstl (1)
- jvm (1)
- Redis (2)
- mongodb (3)
- JAVA (2)
- mybatis (1)
- SQLserver (1)
- GC (1)
- zabbix (1)
- node (1)
最新评论
-
huosange:
简单明了,通俗易懂
JAVA为什么只允许单继承
一、问题描述
假设雇员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:
Resume.drl
BonusRule.drl
AwardPunish.drl
TotalRule.drl
注意:
[1]Split结点类型为OR,约束选择alwaystrue.表示选择其规则组中所有符合事实的规则进行并发执行;
[2] Join结点类型为AND,表示当且进当上述规则组均执行完毕后,才执行后面的规则或进程。
六、测试代码:
Employ:
EmployTest:
测试结果:
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
假设雇员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
相关推荐
本示例旨在演示如何在Drools 5.1中使用规则流(Rule Flow)进行复杂的业务流程管理。规则流是Drools提供的一种工具,它允许用户通过图形化方式定义规则执行的顺序和条件,从而更好地控制业务逻辑的执行流程。 首先...
《Drools 5.1 开发中文文档》是一份详尽的指南,专注于Drools这一开源规则引擎的最新版本。Drools是一个强大的业务规则管理和决策支持系统,其5.1版本引入了多项改进和增强,旨在提高灵活性、性能和易用性。 在介绍...
Drools 是一个开源的业务规则管理系统(BRMS),它基于Java平台,提供了强大的规则引擎和规则流(Workflow)功能。这篇文章将深入探讨Drools如何实现规则流,以及如何在实际项目中有效应用。 ### 一、Drools 概述 ...
Drools正是在此基础上,通过采用规则驱动的方法,优化并扩展了专家系统的功能,成为一种更先进的生产规则系统。 #### 生产规则系统与业务规则管理 生产规则系统是一种特定类型的规则引擎,其核心在于使用一阶逻辑...
**JBoss Drools 5.5 规则流完整代码详解** JBoss Drools 是一个开源的业务规则管理系统(BRMS),它允许开发者通过规则语言(如DRL)来定义和执行业务规则。在5.5版本中,Drools 提供了强大的规则流(Rule Flow)...
在这个"drools5 规则动态加载示例"中,我们将探讨如何在不重启服务的情况下,实现规则的热更新,即动态加载修改后的规则文件,使得业务逻辑能够实时适应变化。 在传统的软件开发中,一旦应用部署,若需更改业务规则...
本文将围绕Drools 6版本中的规则流部分进行深入探讨,详细介绍其工作原理、配置方法及示例应用。 #### 二、规则流概念 规则流(Rule Flow)是Drools中用于定义规则执行顺序的一种机制,它通过图形化的方式展现规则...
在这个Demo中,可能会有各种各样的示例规则和相应的触发条件,以展示Drools的灵活性和强大功能。此外,Drools还提供了事件处理和复杂的事件处理(CEP)功能,可以用来处理实时事件流。 总的来说,"Java Drools Demo...
通过这个"JerryDroolsTest"示例,你可以了解到Drools如何与Java代码集成,以及如何定义、加载和执行业务规则。这只是一个基础的示例,实际项目中可能涉及规则的组织、优化、并发执行等多个方面,都需要深入学习和...
Drools规则引擎是一种嵌套在应用程序中的组件, 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。 它实现了将业务规则从程序代码忠分离出来,规则引擎使用特定的语法编写业务规则,规则引擎...
drools动态生成规则文件是基于Java的业务规则管理系统,它允许开发者在运行时创建、修改和执行业务规则。 Drools是Red Hat JBoss BRMS(Business Rules Management System)的一部分,它提供了一种强大的规则引擎,...
Drools是Java平台上的一个开源规则引擎,它允许开发者以声明式的方式编写业务规则,从而将复杂的逻辑从应用程序中分离出来,提高了代码的可读性和维护性。 Drools的核心概念包括规则(Rule)、工作内存(Working ...
Drools 规则引擎是基于 Java 的开源规则引擎,由 JBoss 发布。作为一个业务规则管理系统(BRMS),Drools 提供了一个基于规则的系统,用于定义、执行和管理业务规则。Drools 的主要功能是将业务规则与应用程序逻辑...
创建你的第一个Drools项目,步骤包括:创建Drools Project,输入项目名称,选择创建规则文件和规则Java类,指定Drools版本,最后运行`DroolsTest`来查看效果。 在Drools中,规则的编译、收集和执行通过API进行。`...
Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景。 在 Drools 中,规则的执行顺序主要由以下因素决定: 1. **规则优先级**:...
Java规则引擎Drools是基于Java平台的企业级规则引擎,它允许开发者以声明式的方式定义业务规则,并在运行时高效地执行这些规则。Drools是JBOSS的一个开源项目,广泛应用于金融、保险、电信等领域,用于实现复杂的...
Drools的核心是一个高性能的规则引擎,它支持决策表、流程管理等功能,并且能够很好地与Java应用程序集成。 #### 二、Rete算法详解 Rete算法是一种高效的模式匹配算法,由Charles L. Forgy在1974年提出。这一算法...
Drools是一款强大的规则引擎,由Red ...通过这个"Drools规则引擎使用demo",你可以学习如何配置、加载规则,以及如何在Java应用程序中使用Drools进行规则的执行和事实的管理。这将为你构建智能决策系统提供坚实的基础。
Java规则引擎Drools是一种强大的业务规则管理系统,它允许开发者将复杂的业务逻辑以规则的形式分离出来,便于管理和维护。Drools是基于Model Driven Architecture(MDA)的,它支持RuleML和Business Rule Markup ...
Drools是一个基于Java语言的开源业务规则管理系统(BRMS),它允许业务专家或开发者以规则脚本的形式编写业务逻辑,并能够即时在线上环境中对规则进行修改而无需重启应用。Drools提供了自己的规则定义语言(DRL),...