Drools学习笔记2

本文深入解析了Drools API中关键类的作用,包括KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession和StatelessKnowledgeSession,并详细介绍了如何通过Drools API执行规则。同时,提供了对Drools的全面理解,包括如何构建规则库、规则执行流程以及不同session对象的特点。

接上面的代码:

 

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。

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值