【java规则引擎】之Drools引擎中模拟ReteooStatefulSession内部设计结构
该片文章只是抽取drools中java代码实现的一些代码结构,帮助我们理解drools是如何实现rete算法的。
该部分只是抽取ReteooStatefulSession工作过程中的代码架构
利用了多线程设计的一个代理模式(自己起的名字)
利用了23中设计模式中的命令模式
一:模拟drools中ReteooStatefulSession的实现对象StatefulSession
package com.nonbankcard.drools.module; /**
*
* 在当前的设计模式中:
* (1)它作为规则匹配的发起者,它内部引用了执行器代理,执行器
* (2)执行器引用了它
* (3)它提交一个命令,交给执行器代理,执行器代理交给执行器线程异步处理
*
*在drools中
* (1)把规则库理解成一个数据库,规则匹配的入口,类比jdbc的一个链接对象
* (2)它引用ruleBase(规则库)
* (3)RuleBase(规则库)里也引用了它
* @author sxf
*
*/
public class StatefulSession implements WorkingMemory{ /**
* 业务执行器的代理
*/
private DefaultExecutorService executorService; public StatefulSession(DefaultExecutorService executorService ){
this.executorService=executorService;
} /**
* 异步插入命令,执行命令
* @param object
* @return
*/
public Future asyncInsert(final Command command) {
this.executorService.submit(command);
return (Future) command;
} /**
* 是否得到执行规则
*/
@Override
public String isGetRule() { return "我得到了执行规则,name=[sxf]";
} }
二:模拟drools中DefaultExecutorService的实现对象DefaultExecutorService
package com.nonbankcard.drools.module;
/**
* 业务命令执行代理
* @author sxf
*
*/
public class DefaultExecutorService { //线程类
private Thread thread; /**
* 业务命令真正的执行者线程
*
*/
private CommandExecutor commandExecutor;
/**
* 命令执行器是否已经开始执行
*/
private boolean runing; /**
* 空构造
*/
public DefaultExecutorService(){ } /**
* 构造函数
*/
public DefaultExecutorService(CommandExecutor commandExecutor){
this.commandExecutor=commandExecutor;
} /**
* (1)给业务命令执行代理提交命令
* (2)其实内部是交给真正的线程执行(CommandExecutor)
* @param command
* @return
*/
public Future submit(Command command){
if(!runing){
//启动命令执行器
startUp();
} //交给真正的命令执行器执行
return (Future) this.commandExecutor.submint(command);
} /**
* 启动真正的命令执行器
*/
public void startUp(){
//启动命令执行器的线程
this.thread=new Thread(this.commandExecutor);
this.thread.start();
//将命令执行器的状态设置为启动
this.runing=true;
} public void shutDown() {
//关闭命令执行器的线程
this.commandExecutor.shutDown();
//关闭当前命令执行代理的标识
this.runing = false;
//释放真正命令执行器的引用,让线程体被Gc回收
this.thread = null;
} public CommandExecutor getCommandExecutor() {
return commandExecutor;
} public void setCommandExecutor(CommandExecutor commandExecutor) {
this.commandExecutor = commandExecutor;
} }
三:模拟drools中CommandExecutor的实现对象CommandExecutor
package com.nonbankcard.drools.module; import java.util.concurrent.BlockingQueue; /**
*业务命令执行器
* @author sxf
*
*/
public class CommandExecutor implements Runnable { /**
* 阻塞队列
*/
private BlockingQueue<Command> queue; /**
* 这个引用,就是statefulSession的引用
*/
private WorkingMemory WorkingMemory; /**
* 命令执行的标识
*/
private boolean running; public CommandExecutor(StatefulSession session){
this.WorkingMemory=session;
} /**
* 给命令执行器提交一个命令
* @param command
*/
public Future submint(Command command){
//把命令放到队列里,等待线程执行
this.queue.offer(command);
//此处在下一个版本升级的时候,返回这个命令。
//可以从这个命令里获取命令的执行结果
return (Future) command;
} /**
* 业务命令执行器的线程体
*/
@Override
public void run() {
this.running=true; while(this.running){
try {
//从队列中取出命令
Command command=queue.take();
//执行命令,传入的就是statefulSession
command.execute(WorkingMemory);
} catch (InterruptedException e) {
e.printStackTrace();
}
} } /**
* 关闭命令执行线程
*/
public void shutDown(){
this.running=false;
} }
四:模拟drools中Command的实现对象Command
package com.nonbankcard.drools.module;
/**
* 命令接口
* @author sxf
*
*/
public interface Command { /**
* 执行命令的接口定义
* @param workingMemory==>这里传的就是StatefulSession
*/
public void execute(WorkingMemory workingMemory);
}
五:模拟drools中Future的实现对象Future
package com.nonbankcard.drools.module;
/**
* 命令执行结果查询
* @author sxf
*
*/
public interface Future {
/**
* 命令是否执行
* @return
*/
public boolean isDone();
/**
* 获取命令执行结果
* @return
*/
public Object getDoneResult();
/**
* 获取命令执行的异常信息
* @return
*/
public Exception getDoneingException();
}
六:模拟drools中FireAllRules的实现对象FireRuleCommand
package com.nonbankcard.drools.module;
/**
* 激活规则的命令
* @author sxf
*
*/
public class FireRuleCommand implements Command,Future{
/**
* 命令是否被执行
*/
private volatile boolean done;
/**
* 命令执行过程中的异常
*/
private Exception e;
/**
* 命令的执行结果
*/
private Object object; /**
* 执行命令
*/
@Override
public void execute(WorkingMemory workingMemory) {
try {
//模拟执行命令
Thread.sleep(1000L);
object=workingMemory.isGetRule();
} catch (Exception e) {
//给命令赋值执行异常
this.e=e;
}
//表示命令已经执行
this.done=done;
} /**
* 命令是否执行
*/
@Override
public boolean isDone() {
return this.done;
} /**
* 获取命令的执行结果
*/
@Override
public Object getDoneResult() {
return this.object;
} /**
* 获取命令执行过程中的异常
*/
@Override
public Exception getDoneingException() {
return this.e;
} }
七:模拟drools中WorkingMemory的实现对象WorkingMemory
package com.nonbankcard.drools.module;
/**
* 【1】statefulSession实现的接口
* 【2】在drools里该接口的作用
* (1)定义了关于获取最终fact匹配上规则要执行的议程
* (2)定义了激活规则的方法
* (3)定义了匹配过程中需要执行的Handler等内容
* @author sxf
*
*/
public interface WorkingMemory { /**
* 是否得到匹配规则
* @return
*/
public String isGetRule(); }
八:模拟drools中ReteooStatefulSession启动的实现过程,该过程隐藏在drools中的org.drools.reteoo.ReteooRuleBase.newStatefulSession()方法中
package com.nonbankcard.drools.module;
/**
* statefulSession的启动过程
* @author sxf
*
*/
public class StateFulSessionTest { public static void main(String[] args) { //生成一个业务命令执行代理
DefaultExecutorService executorService=new DefaultExecutorService(); //生成一个statefulSession
StatefulSession session=new StatefulSession(executorService); //生成真正执行命令的线程体
CommandExecutor commandExecutor=new CommandExecutor(session); //将真正执行命令的线程体放入业务命令执行代理
executorService.setCommandExecutor(commandExecutor); //sesssion初始化完毕。可以开始做规则匹配的任务了
//初始化一个命令
FireRuleCommand fireCommand=new FireRuleCommand(); //session可以异步添加命令
Future future=(Future) session.asyncInsert(fireCommand); } }
【java规则引擎】之Drools引擎中模拟ReteooStatefulSession内部设计结构的更多相关文章
- iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)
在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...
- [Drools]JAVA规则引擎 -- Drools- 转http://blog.csdn.net/quzishen/article/details/6163012
[Drools]JAVA规则引擎 -- Drools 标签: java引擎exceptiongetterstringsetter 2011-01-25 14:33 113340人阅读 评论(35) 收 ...
- 【java规则引擎】drools6.5.0版本中kmodule.xml解析
kmodule.xml文件存放在src/main/resources/META-INF/文件夹下. <?xml version="1.0" encoding="UT ...
- 【java规则引擎】一个基于drools规则引擎实现的数学计算例子
最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...
- 【java规则引擎】drools6.5.0中kie的概论
什么是KIE? KIE是jBoss里面一些相关项目的统称,下图就是KIE代表的一些项目,其中我们比较熟悉的就有jBPM和Drools. 这些项目都有一定的关联关系,并且存在一些通用的API,比如说涉及 ...
- 【java规则引擎】之Drools之Rete算法
一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
转载至:https://blog.csdn.net/wo541075754/article/details/75511887 activation-group 该属性将若干个规则划分成一个组,统一命名 ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析
转载至:https://blog.csdn.net/wo541075754/article/details/75004575 3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法 ...
随机推荐
- python多线程编程(3): 使用互斥锁同步线程
问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...
- php……流程
流程:由两个及以上的业务步骤,完成一个完整的业务行为的过程,可称之为流程:注意是两个及以上的业务步骤.事物进行过程中的次序或顺序的布置和安排. 创建页面: 登录页面(login.php): <h ...
- $Android中日期和时间选择器的实现
创建日期或时间选择窗口需要弹出Dialog的时候,Activity类的showDialog方法已经弃用了,而推荐使用的是DialogFragment,本文总结一下其具体用法. (一)日期选择器 1.创 ...
- Python编程-编码、文件处理、函数
一.字符编码补充知识点 1.文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后 ...
- SOA 面向服务架构 阅读笔记(二)
SOA并不能保证企业的员工更加轻松,企业的收益更加客观. 6.软件组件 6.1 组件和组件的作用 通过可重用的软件代码-组件,可以构建灵活的软件. 6.2 软件组件又称为应用程序,程序,函数,模 ...
- 斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection
异常检测,广泛用于欺诈检测(例如“此信用卡被盗?”). 给定大量的数据点,我们有时可能想要找出哪些与平均值有显着差异. 例如,在制造中,我们可能想要检测缺陷或异常. 我们展示了如何使用高斯分布来建模数 ...
- 多校hdu5726 线段树+预处理
第一问是没有修改的线段树,第二问暴力预处理,因为gcd的结果不会很多 在预处理阶段需要把每个区间的gcd相等的数量储存起来(用map容器),在一个序列例如:12467,枚举左区间L直到n此处时间为O( ...
- java基础(8)-集合类
增强for循环 /* *增强for循环 * for(元素类型 变量:数据或Collection集合){ * 使用变量即可,该变量就是元素 * } * 优点:简化了数组和集合的遍历 * 缺点:增强for ...
- HDU1565 方格取数(1)
Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数 ...
- Redis源码分析:serverCron - redis源码笔记
[redis源码分析]http://blog.csdn.net/column/details/redis-source.html Redis源代码重要目录 dict.c:也是很重要的两个文件,主要 ...