该片文章只是抽取drools中java代码实现的一些代码结构,帮助我们理解drools是如何实现rete算法的。
  该部分只是抽取ReteooStatefulSession工作过程中的代码架构

利用了多线程设计的一个代理模式(自己起的名字)

  利用了23中设计模式中的命令模式

一:模拟drools中ReteooStatefulSession的实现对象StatefulSession

  1. package com.nonbankcard.drools.module;
  2.  
  3. /**
  4. *
  5. * 在当前的设计模式中:
  6. * (1)它作为规则匹配的发起者,它内部引用了执行器代理,执行器
  7. * (2)执行器引用了它
  8. * (3)它提交一个命令,交给执行器代理,执行器代理交给执行器线程异步处理
  9. *
  10. *在drools中
  11. * (1)把规则库理解成一个数据库,规则匹配的入口,类比jdbc的一个链接对象
  12. * (2)它引用ruleBase(规则库)
  13. * (3)RuleBase(规则库)里也引用了它
  14. * @author sxf
  15. *
  16. */
  17. public class StatefulSession implements WorkingMemory{
  18.  
  19. /**
  20. * 业务执行器的代理
  21. */
  22. private DefaultExecutorService executorService;
  23.  
  24. public StatefulSession(DefaultExecutorService executorService ){
  25. this.executorService=executorService;
  26. }
  27.  
  28. /**
  29. * 异步插入命令,执行命令
  30. * @param object
  31. * @return
  32. */
  33. public Future asyncInsert(final Command command) {
  34. this.executorService.submit(command);
  35. return (Future) command;
  36. }
  37.  
  38. /**
  39. * 是否得到执行规则
  40. */
  41. @Override
  42. public String isGetRule() {
  43.  
  44. return "我得到了执行规则,name=[sxf]";
  45. }
  46.  
  47. }

二:模拟drools中DefaultExecutorService的实现对象DefaultExecutorService

  1. package com.nonbankcard.drools.module;
  2. /**
  3. * 业务命令执行代理
  4. * @author sxf
  5. *
  6. */
  7. public class DefaultExecutorService {
  8.  
  9. //线程类
  10. private Thread thread;
  11.  
  12. /**
  13. * 业务命令真正的执行者线程
  14. *
  15. */
  16. private CommandExecutor commandExecutor;
  17. /**
  18. * 命令执行器是否已经开始执行
  19. */
  20. private boolean runing;
  21.  
  22. /**
  23. * 空构造
  24. */
  25. public DefaultExecutorService(){
  26.  
  27. }
  28.  
  29. /**
  30. * 构造函数
  31. */
  32. public DefaultExecutorService(CommandExecutor commandExecutor){
  33. this.commandExecutor=commandExecutor;
  34. }
  35.  
  36. /**
  37. * (1)给业务命令执行代理提交命令
  38. * (2)其实内部是交给真正的线程执行(CommandExecutor)
  39. * @param command
  40. * @return
  41. */
  42. public Future submit(Command command){
  43. if(!runing){
  44. //启动命令执行器
  45. startUp();
  46. }
  47.  
  48. //交给真正的命令执行器执行
  49. return (Future) this.commandExecutor.submint(command);
  50. }
  51.  
  52. /**
  53. * 启动真正的命令执行器
  54. */
  55. public void startUp(){
  56. //启动命令执行器的线程
  57. this.thread=new Thread(this.commandExecutor);
  58. this.thread.start();
  59. //将命令执行器的状态设置为启动
  60. this.runing=true;
  61. }
  62.  
  63. public void shutDown() {
  64. //关闭命令执行器的线程
  65. this.commandExecutor.shutDown();
  66. //关闭当前命令执行代理的标识
  67. this.runing = false;
  68. //释放真正命令执行器的引用,让线程体被Gc回收
  69. this.thread = null;
  70. }
  71.  
  72. public CommandExecutor getCommandExecutor() {
  73. return commandExecutor;
  74. }
  75.  
  76. public void setCommandExecutor(CommandExecutor commandExecutor) {
  77. this.commandExecutor = commandExecutor;
  78. }
  79.  
  80. }

三:模拟drools中CommandExecutor的实现对象CommandExecutor

  1. package com.nonbankcard.drools.module;
  2.  
  3. import java.util.concurrent.BlockingQueue;
  4.  
  5. /**
  6. *业务命令执行器
  7. * @author sxf
  8. *
  9. */
  10. public class CommandExecutor implements Runnable {
  11.  
  12. /**
  13. * 阻塞队列
  14. */
  15. private BlockingQueue<Command> queue;
  16.  
  17. /**
  18. * 这个引用,就是statefulSession的引用
  19. */
  20. private WorkingMemory WorkingMemory;
  21.  
  22. /**
  23. * 命令执行的标识
  24. */
  25. private boolean running;
  26.  
  27. public CommandExecutor(StatefulSession session){
  28. this.WorkingMemory=session;
  29. }
  30.  
  31. /**
  32. * 给命令执行器提交一个命令
  33. * @param command
  34. */
  35. public Future submint(Command command){
  36. //把命令放到队列里,等待线程执行
  37. this.queue.offer(command);
  38. //此处在下一个版本升级的时候,返回这个命令。
  39. //可以从这个命令里获取命令的执行结果
  40. return (Future) command;
  41. }
  42.  
  43. /**
  44. * 业务命令执行器的线程体
  45. */
  46. @Override
  47. public void run() {
  48. this.running=true;
  49.  
  50. while(this.running){
  51. try {
  52. //从队列中取出命令
  53. Command command=queue.take();
  54. //执行命令,传入的就是statefulSession
  55. command.execute(WorkingMemory);
  56. } catch (InterruptedException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60.  
  61. }
  62.  
  63. /**
  64. * 关闭命令执行线程
  65. */
  66. public void shutDown(){
  67. this.running=false;
  68. }
  69.  
  70. }

四:模拟drools中Command的实现对象Command

  1. package com.nonbankcard.drools.module;
  2. /**
  3. * 命令接口
  4. * @author sxf
  5. *
  6. */
  7. public interface Command {
  8.  
  9. /**
  10. * 执行命令的接口定义
  11. * @param workingMemory==>这里传的就是StatefulSession
  12. */
  13. public void execute(WorkingMemory workingMemory);
  14. }

五:模拟drools中Future的实现对象Future

  1. package com.nonbankcard.drools.module;
  2. /**
  3. * 命令执行结果查询
  4. * @author sxf
  5. *
  6. */
  7. public interface Future {
  8. /**
  9. * 命令是否执行
  10. * @return
  11. */
  12. public boolean isDone();
  13. /**
  14. * 获取命令执行结果
  15. * @return
  16. */
  17. public Object getDoneResult();
  18. /**
  19. * 获取命令执行的异常信息
  20. * @return
  21. */
  22. public Exception getDoneingException();
  23. }

六:模拟drools中FireAllRules的实现对象FireRuleCommand

  1. package com.nonbankcard.drools.module;
  2. /**
  3. * 激活规则的命令
  4. * @author sxf
  5. *
  6. */
  7. public class FireRuleCommand implements Command,Future{
  8. /**
  9. * 命令是否被执行
  10. */
  11. private volatile boolean done;
  12. /**
  13. * 命令执行过程中的异常
  14. */
  15. private Exception e;
  16. /**
  17. * 命令的执行结果
  18. */
  19. private Object object;
  20.  
  21. /**
  22. * 执行命令
  23. */
  24. @Override
  25. public void execute(WorkingMemory workingMemory) {
  26. try {
  27. //模拟执行命令
  28. Thread.sleep(1000L);
  29. object=workingMemory.isGetRule();
  30. } catch (Exception e) {
  31. //给命令赋值执行异常
  32. this.e=e;
  33. }
  34. //表示命令已经执行
  35. this.done=done;
  36. }
  37.  
  38. /**
  39. * 命令是否执行
  40. */
  41. @Override
  42. public boolean isDone() {
  43. return this.done;
  44. }
  45.  
  46. /**
  47. * 获取命令的执行结果
  48. */
  49. @Override
  50. public Object getDoneResult() {
  51. return this.object;
  52. }
  53.  
  54. /**
  55. * 获取命令执行过程中的异常
  56. */
  57. @Override
  58. public Exception getDoneingException() {
  59. return this.e;
  60. }
  61.  
  62. }

七:模拟drools中WorkingMemory的实现对象WorkingMemory

  1. package com.nonbankcard.drools.module;
  2. /**
  3. * 【1】statefulSession实现的接口
  4. * 【2】在drools里该接口的作用
  5. * (1)定义了关于获取最终fact匹配上规则要执行的议程
  6. * (2)定义了激活规则的方法
  7. * (3)定义了匹配过程中需要执行的Handler等内容
  8. * @author sxf
  9. *
  10. */
  11. public interface WorkingMemory {
  12.  
  13. /**
  14. * 是否得到匹配规则
  15. * @return
  16. */
  17. public String isGetRule();
  18.  
  19. }

八:模拟drools中ReteooStatefulSession启动的实现过程,该过程隐藏在drools中的org.drools.reteoo.ReteooRuleBase.newStatefulSession()方法中

  1. package com.nonbankcard.drools.module;
  2. /**
  3. * statefulSession的启动过程
  4. * @author sxf
  5. *
  6. */
  7. public class StateFulSessionTest {
  8.  
  9. public static void main(String[] args) {
  10.  
  11. //生成一个业务命令执行代理
  12. DefaultExecutorService executorService=new DefaultExecutorService();
  13.  
  14. //生成一个statefulSession
  15. StatefulSession session=new StatefulSession(executorService);
  16.  
  17. //生成真正执行命令的线程体
  18. CommandExecutor commandExecutor=new CommandExecutor(session);
  19.  
  20. //将真正执行命令的线程体放入业务命令执行代理
  21. executorService.setCommandExecutor(commandExecutor);
  22.  
  23. //sesssion初始化完毕。可以开始做规则匹配的任务了
  24. //初始化一个命令
  25. FireRuleCommand fireCommand=new FireRuleCommand();
  26.  
  27. //session可以异步添加命令
  28. Future future=(Future) session.asyncInsert(fireCommand);
  29.  
  30. }
  31.  
  32. }

【java规则引擎】之Drools引擎中模拟ReteooStatefulSession内部设计结构的更多相关文章

  1. iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)

    在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...

  2. [Drools]JAVA规则引擎 -- Drools- 转http://blog.csdn.net/quzishen/article/details/6163012

    [Drools]JAVA规则引擎 -- Drools 标签: java引擎exceptiongetterstringsetter 2011-01-25 14:33 113340人阅读 评论(35) 收 ...

  3. 【java规则引擎】drools6.5.0版本中kmodule.xml解析

    kmodule.xml文件存放在src/main/resources/META-INF/文件夹下. <?xml version="1.0" encoding="UT ...

  4. 【java规则引擎】一个基于drools规则引擎实现的数学计算例子

    最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...

  5. 【java规则引擎】drools6.5.0中kie的概论

    什么是KIE? KIE是jBoss里面一些相关项目的统称,下图就是KIE代表的一些项目,其中我们比较熟悉的就有jBPM和Drools. 这些项目都有一定的关联关系,并且存在一些通用的API,比如说涉及 ...

  6. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

  7. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)

    4.4.3 约束(Pattern的一部分) 前面我们已经介绍了条件约束在Pattern中位置了,那么什么是条件约束呢?简单来说就是一个返回true或者false的表达式,比如下面的5小于6,就是一个约 ...

  8. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective

    转载至:https://blog.csdn.net/wo541075754/article/details/75511887 activation-group 该属性将若干个规则划分成一个组,统一命名 ...

  9. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE API解析

    转载至:https://blog.csdn.net/wo541075754/article/details/75004575 3.2.4 KieServices 该接口提供了很多方法,可以通过这些方法 ...

随机推荐

  1. 42和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 设置 ...

  2. 实现对第三方应用任意SO注入

    实现对第三方应用任意SO注入 0x01 应用在Android中运行,从外部对该进程可以进行任意SO文件动态注入,就是应用动态运行我们的SO文件 0x02 基本的逻辑是: 1.    获取目标进程的pi ...

  3. iOS copy 和 mutableCopy 学习

    (参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...

  4. OC知识点(类方法,构造方法,组合模式,get,set方法,自动生成属性)

    1.类方法的优势 不用创建对象,节省了空间,直接用类名调用类方法,类方法为外界提供一个方便的调用接口.(特点:类方法以加号开头,不能使用自身的成员变量,它的调用不依赖成员变量) 2.构造方法(初始化成 ...

  5. 019_Map Task数目的确定和Reduce Task数目的指定

    注意标题:Map Task数目的确定和Reduce Task数目的指定————自然得到结论,前者是后者决定的,后者是人为指定的.查看源码可以很容易看懂 1.MapReduce作业中Map Task数目 ...

  6. 【leetcode刷题笔记】Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  7. HTML5模拟衣服撕扯动画

    在线演示 本地下载

  8. 20145230《java程序设计》第6周学习总结

    20145230 <Java程序设计>第6周学习总结 教材学习内容 串流设计的概念 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取出,可以 ...

  9. DP问题分类总结

    http://m.blog.csdn.net/y990041769/article/details/24194605 此博客总结了动态规划相关问题,学习一下!

  10. Spring学习之xml配置Bean总结

    学习Spring时,我用的是Maven来管理jar包,先看看maven的pom.xml: pom.xml <project xmlns="http://maven.apache.org ...