Drools学习笔记2

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上面的代码:

 

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。

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值