`
allenson933
  • 浏览: 24188 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Drools学习笔记2

阅读更多

接上面的代码:

 

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对象使用的是KnowledgeBuilderFactorynewKnowledgeBuilder方法。

2)      KnowledgeBase

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

3)      StatefulKnowledgeSession

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

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

4)      StatelessKnowledgeSession

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

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

分享到:
评论

相关推荐

    drools学习笔记

    对于学习 drools 的初学者,理解这些基础概念至关重要,它们将帮助你构建复杂的规则系统,实现业务逻辑的自动化和智能化。在实际应用中,根据需求灵活运用这些特性,可以极大地提升软件系统的可维护性和扩展性。

    Drools学习笔记

    2. **Drools 缺点** - **调试困难**:相对于Java代码,规则的调试可能较为复杂。 - **内存消耗**:Drools 运行时可能需要更大的内存空间。 - **规则交互复杂性**:规则间的相互依赖可能导致循环处理,需要谨慎...

    Drools6-笔记

    ### Drools 6基础知识与实践指南 #### 一、Drools 6简介与环境搭建 **Drools** 是一款开源的业务规则管理系统(BRMS),它支持...接下来可以深入学习Drools的高级特性,如决策表、模板等,以更好地应用于实际项目中。

    Drools安装配置学习笔记.doc

    这些示例涵盖了各种Drools的使用场景,是学习和理解Drools功能的好资源。 Drools的主要特性包括规则的编写、推理引擎、工作流支持以及与各种数据源的集成。它的规则语言(DRL)允许开发者用类似英语的语法定义规则...

    drools5 读书笔记

    《drools5 读书笔记》 Drools是一款强大的规则引擎,它基于Java语言,用于在企业级应用中实现复杂的业务逻辑。这个读书笔记主要涵盖了Drools 5版本的相关内容,结合源码分析和工具使用,旨在帮助读者深入理解其工作...

    JBPM3学习笔记

    **JBPM3学习笔记** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了对业务流程的建模、部署、执行和监控的能力。在本文中,我们将深入探讨JBPM3的核心概念、功能和使用方法,以帮助...

    Activiti学习笔记三:管理流程定义

    在“Activiti学习笔记三:管理流程定义”中,我们将深入探讨如何使用Activiti来管理和操作流程定义。 首先,流程定义是Activiti中的核心概念,它是流程模型的静态表示,描述了工作流的结构和规则。流程定义通常以...

    jbpm学习资料,jbpm教程

    在jBPM-jPDL学习笔记中,你将了解到以下关键知识点: 1. **流程定义**:jPDL通过流程图中的节点(如开始节点、结束节点、任务节点、事件节点等)来描述流程的结构。这些节点之间的连线代表了流程的流转路径。 2. *...

    JBPM相关学习资料

    - 博文链接:[JBPM学习笔记](https://zhaoshijie.iteye.com/blog/932534) 提供了关于JBPM的实践经验和案例分享,对于初学者来说是很好的参考资料。 通过深入学习和实践,可以更好地理解和掌握JBPM,从而在实际项目...

    Protege新手入门(入门篇+进阶篇+推理篇+使用笔记)

    **2. 创建本体** 在Protege中创建本体,首先需要选择适当的本体语言,如OWL DL或OWL Full。然后,通过“文件”->“新建本体”开始创建新项目。为本体命名并指定存储位置。接着,开始构建类层次结构,通过右键点击类...

    JBPM研究笔记

    **JBPM研究笔记** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了全面的业务流程管理和工作流解决方案。这个系统的核心是基于模型驱动的架构,允许开发者通过图形化的方式设计、...

    工作流引擎笔记

    2. **规则集成**:Jbpm与Drools规则引擎紧密集成,允许在流程中嵌入决策逻辑。 3. **事件驱动**:支持事件触发的流程行为,比如基于时间或特定事件的流程跳转。 4. **持久化**:使用Hibernate进行数据持久化,保证...

    JBossjBPM.rar_工作流引擎

    在提供的压缩包中,“JBossjBPM.nh”可能是一个笔记或文档文件,详细介绍了在实际项目中使用JBoss jBPM的经验和技巧。通常,这种文件会涵盖以下内容: 1. 安装与配置:如何在本地环境中设置jBPM,包括依赖库的导入和...

    Java面试:Java面试,Java基础,JVM,JUC(高并发),Java8新特性,集合,NIO,计算机基础,计算机网络,操作系统,数据结构,计算机组成原理,数据库,MySql,Oracle,Redis,设计模式,Python,工作流(Activiti),规则引擎(Drools),Spring,SpringCloud,Dubbo,Maven,Mybatis,JWT,Netty,Nginx,Shiro,Zookeeper,消息位置(MQ),微服务,Git,Docker,Utils, Linux,Shell

    当学习完一个知识点以后,自己做笔记,同时事后要总结,如果自己能把一个知识清晰表达出来的时候,自己也是有很大的收获和成长的; 赠人玫瑰手留余香。 目录 学习知识相关 Java 计算机基础(重要) 需要完善 需要...

Global site tag (gtag.js) - Google Analytics