- 浏览: 123920 次
- 性别:
- 来自: 广州
-
文章分类
- 全部博客 (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提供的一种工具,它允许用户通过图形化方式定义规则执行的顺序和条件,从而更好地控制业务逻辑的执行流程。 首先...
通过上述步骤,我们可以看到Drools7不仅继承了Drools5的优点,还增强了对现代Java开发框架的支持,使得规则引擎的应用范围更加广泛。 #### 规则 **4.1 规则文件** 在Drools中,规则文件是规则引擎的核心部分,...
jbpm5.1是Java Business Process Management(Java业务流程管理)的一个版本,它是一个开源的工作流管理系统,由JBoss社区开发并维护。该系统基于Drools,一个强大的规则引擎,使得jbpm5.1在处理业务流程时具有灵活...
jbpm5.1是一个基于Java的企业级工作流管理系统,由JBoss公司开发,主要用于管理业务流程。本资源集合包含了jbpm5.1的中文和英文学习文档,旨在帮助开发者深入理解和应用这个强大的工具。 **一、jbpm5.1核心概念** 1...
- **核心组件**:JBPM的核心是一个使用纯Java编写的轻量级、可扩展的工作流引擎。该引擎支持最新的BPMN 2.0规范,能够在任何Java环境中运行,既可以直接嵌入应用程序中,也可以作为服务独立运行。 - **工具支持**:...
3. **规则集成**: 集成了Drools规则引擎,可以将业务规则与流程逻辑紧密结合,方便管理和调整规则。 4. **事件处理**: 支持各种类型的事件,如定时事件、信号事件等,使得流程能对环境变化做出反应。 5. **任务...
在实践中,你还会接触到工作流定义语言(WDL)、规则服务(Drools)以及任务服务等关键概念。 总之,JBPM是一个强大且灵活的业务流程管理平台,它提供了丰富的工具和功能来满足各种业务需求。通过深入学习和实践,...