Drools学习笔记2

接上面的代码:

 

Java代码 复制代码  收藏代码
  1. public class DroolsTest {   
  2.   
  3.     public static final void main(String[] args) {   
  4.         try {   
  5.             // load up the knowledge base   
  6.             KnowledgeBase kbase = readKnowledgeBase();   
  7.             StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();   
  8.             KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");   
  9.             // go !   
  10.             PeopleEvent pe = new PeopleEvent();   
  11.             pe.setComming(true);   
  12.             pe.setRoomId(1);   
  13.             TemperatureEvent te =  new TemperatureEvent();   
  14.             te.setTemperature(19.5f);   
  15.             te.setRoomId(1);   
  16.             ksession.insert(pe);   
  17.             ksession.insert(te);   
  18.             ksession.fireAllRules();   
  19.             logger.close();   
  20.         } catch (Throwable t) {   
  21.             t.printStackTrace();   
  22.         }   
  23.     }   
  24.   
  25.     private static KnowledgeBase readKnowledgeBase() throws Exception {   
  26.         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();   
  27.         kbuilder.add(ResourceFactory.newClassPathResource("FirstRule.drl"), ResourceType.DRL);   
  28.         KnowledgeBuilderErrors errors = kbuilder.getErrors();   
  29.         if (errors.size() > 0) {   
  30.             for (KnowledgeBuilderError error: errors) {   
  31.                 System.err.println(error);   
  32.             }   
  33.             throw new IllegalArgumentException("Could not parse knowledge.");   
  34.         }   
  35.         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();   
  36.         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());   
  37.         return kbase;   
  38.     }   
  39.   
  40.     public static class PeopleEvent {   
  41.         private boolean isComming;   
  42.         private int roomId;   
  43.            
  44.         public boolean getIsComing() {   
  45.             return isComming;   
  46.         }   
  47.         public void setComming(boolean isComming) {   
  48.             this.isComming = isComming;   
  49.         }   
  50.         public int getRoomId() {   
  51.             return roomId;   
  52.         }   
  53.         public void setRoomId(int roomId) {   
  54.             this.roomId = roomId;   
  55.         }   
  56.     }   
  57.     public static class TemperatureEvent{   
  58.         private float temperature;   
  59.         private int roomId;   
  60.         public float getTemperature() {   
  61.             return temperature;   
  62.         }   
  63.         public void setTemperature(float temperature) {   
  64.             this.temperature = temperature;   
  65.         }   
  66.         public int getRoomId() {   
  67.             return roomId;   
  68.         }   
  69.         public void setRoomId(int roomId) {   
  70.             this.roomId = roomId;   
  71.         }   
  72.     }   
  73. }  
public class DroolsTest {    public static final void main(String[] args) {        try {            // load up the knowledge base            KnowledgeBase kbase = readKnowledgeBase();            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");            // go !            PeopleEvent pe = new PeopleEvent();            pe.setComming(true);            pe.setRoomId(1);            TemperatureEvent te =  new TemperatureEvent();            te.setTemperature(19.5f);            te.setRoomId(1);            ksession.insert(pe);            ksession.insert(te);            ksession.fireAllRules();            logger.close();        } catch (Throwable t) {            t.printStackTrace();        }    }    private static KnowledgeBase readKnowledgeBase() throws Exception {        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        kbuilder.add(ResourceFactory.newClassPathResource("FirstRule.drl"), ResourceType.DRL);        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;    }    public static class PeopleEvent {    	private boolean isComming;    	private int roomId;    			public boolean getIsComing() {			return isComming;		}		public void setComming(boolean isComming) {			this.isComming = isComming;		}		public int getRoomId() {			return roomId;		}		public void setRoomId(int roomId) {			this.roomId = roomId;		}    }    public static class TemperatureEvent{    	private float temperature;    	private int roomId;		public float getTemperature() {			return temperature;		}		public void setTemperature(float temperature) {			this.temperature = temperature;		}		public int getRoomId() {			return roomId;		}		public void setRoomId(int roomId) {			this.roomId = roomId;		}    }}

 

 好了,接下来介绍一下如何来执行Drools是如何来执行规则的,要理解上面的代码首先要清楚Drools API中关于一下几个类的描述:

1)      KnowledgeBuilder  

        KnowledgeBuilder就是用来在业务代码中收集已经编好的规则,找到这些规则并把这些规则文件进行编译,最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。而创建KnowledgeBuilder对象使用的是KnowledgeBuilderFactory的newKnowledgeBuilder方法。

2)      KnowledgeBase

       KnowledgeBase 是Drools提供的用来收集应用当中知识(Knowledge)定义的知识库对象,在一个KnowledgeBase 当中可以包含普通的规则、规则流、函数定义、用户自定义对象等。KnowledgeBase本身不包含任何业务数据对象(fact 对象),业务对象都是插入到由KnowledgeBase产生的两种类型的session对象(StatefulKnowledgeSession和StatelessKnowledgeSession在后面进行介绍)中,而这两种session对象可以用来触发规则。

3)      StatefulKnowledgeSession

     StatefulKnowledgeSession对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道。StatefulKnowledgeSession执行完之后一定要调用dispose()方法释放资源。

     StatefulKnowledgeSession可以接受外部插入(insert方法)的业务数据——也叫fact,一个对象通常可以对应一个普通的POJO, 而一个POJO有若干个属性来描述这个业务对象,比如一个PeopleEvent中包含了isComing(人是否进来属性), roomed(房间号),每一个属性对应getter和setter方法,供规则定义来使用(注意:在规则定义中isComing默认的getter方法是getIsComing())。如果规则当中需要有数据传出,那么可以通过在StatefulKnowledgeSession当中设置global对象来实现,一个global对象也是一个普通的Java对象,在向StatefulKnowledgeSession当中设置global对象时不用insert方法而用setGlobal方法实现。

4)      StatelessKnowledgeSession

        StatelessKnowledgeSession是在StatefulKnowledgeSession基础上进行进一步的封装,它跟StatefulKnowledgeSession的区别就是它不在需要调用dispose()方法释放内存资源了,但它不能重复的插入fact的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,因为它不能保存状态,对应的这些要完成的工作在StatelessKnowledgeSession当中只有execute()方法,通过这个方法可以实现插入所有的fact并且可以同时执行所有的规则或规则流。

         结合上面的代码应该可以更好的了解这四个概念。下面介绍如何更好的使用Drools。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值