`
xiaoyanzi1205
  • 浏览: 42072 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Drools的内存管理

阅读更多

最近在研究Drools 5的文档,发现了一个retract()的使用问题。

我就用eclipse自带的例子说一下吧。

java code:

KnowledgeBase kbase = readKnowledgeBase(); 
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); 
// go ! 
Message message = new Message(); 
message.setMessage("Hello World"); 
message.setStatus(Message.HELLO); 
ksession.insert(message); 
ksession.fireAllRules(); 
System.out.println("======"+message.getMessage());

rule code:

rule "Hello World"
	salience 99
	no-loop 
	when
		m : Message( status == Message.HELLO, myMessage : message )
	then
		System.out.println( myMessage ); 
		m.setMessage( "Goodbye cruel world" );
		m.setStatus( Message.GOODBYE );
		retract( m );
end


rule "GoodBye"
	no-loop 
	when
		Message( status == Message.GOODBYE, myMessage : message )
	then
		System.out.println( myMessage );
end

 执行结果:

     Hello World
     ======Goodbye cruel world

 

Drools文档给的retract()说明是removes an object from working memory(从working memory中移除一个对象),那么既然我已经在memory中移除了m,为什么在java代码里可以打出“======Goodbye cruel world”呢?

 

我现在能理解的是java虚拟机为Message在堆中分配内存,这个内存和Drools运行时内存不同但又有联系,然后java代码把这个Message的引用插入到了Drools的内存,Drools在上面代码中修改了Message在堆中的属性值,而retract()只是移除掉了Drools运行时内存中的Message,这个解释正确与否我现在也不知道,大家以为怎么回事呢

 

分享到:
评论
5 楼 xiaoyanzi1205 2010-06-02  
duanhengbin 写道
不好意思订正下第一次回复的描述:(最重要一句错了,汗。。。)

DROOLS自动将条件区定义的 引用,在THEN区转换成结果区的指针!
                                             ~~~~~~
正确应该是:                                 调用区

呵呵,谢谢啦
4 楼 duanhengbin 2010-06-01  
不好意思订正下第一次回复的描述:(最重要一句错了,汗。。。)

DROOLS自动将条件区定义的 引用,在THEN区转换成结果区的指针!
                                             ~~~~~~
正确应该是:                                 调用区
3 楼 duanhengbin 2010-06-01  
压力测试倒是没有,可以google上查下 “drools forum”,
见过不少老外讨论这个。
2 楼 xiaoyanzi1205 2010-06-01  
duanhengbin 写道
呵呵 ,上面 这个例子反映了DROOLS一个奇妙的特性。

即工作区变量 与 调用区变量 在规则中,是根据使用位置不同自动转换的。

在规则 WHEN区,使用的是 工作区变量 ,而 THEN区使用的是 对应的调用区变量。
DROOLS自动将条件区定义的 引用,在THEN区转换成结果区的指针!
(这一点不能太常规思维,经过大量实验证明是确实如此)
所以,当使用retact时删除的仅仅是工作区变量,这时外面的(调用区)变量已经改变了。

顺便提一下,update和modify,其实是将 外部(调用区)的变量重新 覆盖到内部(工作区),来保持内外同步。根本原因是一样的。(保证后执行规则 的WHEN区变量获取最新值)

谢谢duanhengbin的回答,不过我有个疑问,retract是否有必要,如果不使用retract的话是否会引起内存溢出等问题呢?您有压力测试过吗?
1 楼 duanhengbin 2010-06-01  
呵呵 ,上面 这个例子反映了DROOLS一个奇妙的特性。

即工作区变量 与 调用区变量 在规则中,是根据使用位置不同自动转换的。

在规则 WHEN区,使用的是 工作区变量 ,而 THEN区使用的是 对应的调用区变量。
DROOLS自动将条件区定义的 引用,在THEN区转换成结果区的指针!
(这一点不能太常规思维,经过大量实验证明是确实如此)
所以,当使用retact时删除的仅仅是工作区变量,这时外面的(调用区)变量已经改变了。

顺便提一下,update和modify,其实是将 外部(调用区)的变量重新 覆盖到内部(工作区),来保持内外同步。根本原因是一样的。(保证后执行规则 的WHEN区变量获取最新值)

相关推荐

    drools drools drools drools drools

    规则引擎的工作原理是,当新的事实(数据对象)被插入到工作内存中时,drools会自动匹配并执行符合条件的规则。 drools 提供了以下主要组件: - Guvnor:一个规则资产管理工具,用于创建、管理和版本控制业务规则。...

    drools7.25中文文档+drools技术指南.zip

    Drools是一款强大的业务规则管理系统(BRMS),它基于Java平台,主要用于实现复杂业务规则的管理和执行。Drools7.25是该系统的一个重要版本,提供了许多新特性和性能改进,使得开发者能够更高效地处理和执行业务规则...

    drools动态生成规则文件

    3. 内存中的规则:除了生成.drl文件,drools还支持在内存中创建规则。这可以通过构建RuleDescr对象并使用KnowledgeBuilder.add()方法添加到规则库中。 四、工作记忆与事实 在drools中,规则的执行依赖于工作记忆...

    Drools开发最全中文版技术指南

    Drools提供了一个灵活的框架,包括规则语言(DRL)、工作内存、事实对象和执行引擎等关键组件,使得业务规则的管理变得简单且高效。 在Drools中,规则语言DRL(Drools Rule Language)是编写规则的主要工具。DRL...

    Drools规则引擎使用demo

    Drools是一款强大的规则引擎,由Red Hat公司开发并维护,它主要用于实现业务规则的管理和执行。Drools提供了一种声明式的方式来定义业务规则,使得非技术人员也能理解和修改规则,从而降低了业务逻辑与代码的耦合度...

    droolsdroolsdrools

    它基于Java平台,采用领域特定语言(DSL)来编写业务规则,使得业务人员也能参与到规则的管理和维护中,极大地提高了业务规则的灵活性和可维护性。本篇文章将围绕"droolsdroolsdrools"这一主题,通过深入剖析提供的...

    Drools7 + Springboot2 动态更新规则

    Drools 7引入了更高效的工作内存管理,优化了执行性能,并提供了更丰富的API和改进的规则语法。 接下来,我们讨论如何在Spring Boot项目中集成Drools。首先,我们需要在`pom.xml`中添加Drools和Spring Boot的依赖。...

    drools flow分析报告

    Drools Flow 是 Drools 项目的一部分,它提供了一套完整的业务流程管理(BPM)和工作流解决方案。Drools 是一个开源的规则引擎,主要用于决策管理和业务逻辑处理。它基于Java,遵循JBoss社区的开发,并被广泛应用于...

    Drools7 demo

    Drools7在性能上有了显著提升,引入了更快的规则匹配算法和内存管理优化,使得大规模规则集的处理更加高效。 6. **规则单元测试**: 提供了专门的规则测试框架,使得开发人员可以方便地对规则进行单元测试,确保...

    drools6.2 中文文档

    10. **优化与性能**:Drools 提供了多种优化技术,如规则排序、并行执行、内存管理等,以提高规则引擎的性能。 11. **测试与调试**:Drools 提供了测试框架,允许开发者编写单元测试来验证规则的正确性,并提供调试...

    Drools实例

    在GOLF和EmployTest中,我们可能还会看到如何使用Drools的工作内存、规则流( Agenda )以及如何通过Java API或KIE工作台来部署和执行规则。 此外,Drools的规则库设计使得规则可以独立于应用程序代码,这增强了...

    Drools规则执行顺序

    2. **事实插入顺序**:Drools 的规则引擎基于事件驱动模型,当新的事实(数据对象)被插入到工作内存时,引擎会检查是否有匹配的规则。如果多个规则都能匹配同一个事实,那么这些规则会按照它们被定义的顺序执行。 ...

    Drools中文文档

    - **定义**:Drools运行时的内存区域,用于存储Fact对象。 - **功能**:提供规则执行所需的上下文环境。 **4. KIE(Knowledge Is Everything)**: - **定义**:Drools的新一代API框架。 - **目的**:简化规则引擎...

    drools集成springboot demo

    3. **SpringBoot配置**:在`application.properties`或`application.yml`中,可能需要配置drools的相关参数,如规则文件路径、工作内存大小等。也可以创建一个`@Configuration`类,通过`@Bean`注解来创建和配置`...

    drools实现demo

    6. **规则触发和执行**:Drools的执行流程包括添加事实到工作内存,然后通过`fireAllRules()`方法触发规则的执行。如果规则条件满足,就会执行相应的动作,如修改事实的属性(积分增加)或触发其他业务逻辑。 7. **...

    idea开发drools的设置文件

    Drools 提供了一个强大的规则语言(DRL - Drools Rule Language)来声明规则,并且集成了工作流引擎,使得业务流程管理成为可能。在 IT 领域,Drools 广泛应用于金融、保险、医疗等行业的决策自动化。 ** 在 IDEA ...

    Drools4.0官方使用手册中文

    3. **第三章:工作内存和事实** - 本章讲解了Drools中的核心组件——工作内存,以及如何在其中存储和管理“事实”对象。工作内存是规则执行的舞台,而事实则是规则作用的对象。 4. **第四章:规则的触发与执行** - ...

    Drools-复杂事件处理

    - **内存管理**:调整工作内存大小,优化事件处理速度。 - **并行处理**:利用多核CPU进行并行事件处理。 9. **结论** Drools以其强大的规则处理能力和对复杂事件处理的支持,成为现代业务智能化的重要工具。...

    kie-drools-wb

    - **工作内存**:Drools中的概念,存储所有运行时对象和规则的实例。 - **规则流**:用于描述规则执行顺序的流程图,可以通过Drools Workbench进行可视化配置。 - **决策表**:以表格形式定义规则,方便非技术人员...

Global site tag (gtag.js) - Google Analytics