Drools KieSession导致内存泄漏

时间:2017-12-05 09:13:27

标签: drools

我正在使用Drools 6.3.0.Final在不同的KieSession中运行100条规则,每个会话一条规则,并且引擎在STREAM模式下工作。我在代码级别使用注释@Expires来定义我在会话中推送的Pojo的生命周期。

问题是在运行应用程序几个小时之后,我注意到内存泄漏,通过分析堆转储,我可以看到数百万个Poro从Drool Sessions中引用。这意味着Pojos不会从会话中删除。

知道如何解决这个问题吗?

这是我的Pojo:

@Role(Role.Type.EVENT)
@Expires("10s")
public class DataStreamRecord {
......
.....
}

1 个答案:

答案 0 :(得分:0)

可以使用Drools 6.5.0-Final修复此问题,这与EAP 6.2存在冲突,如此处所述https://issues.jboss.org/browse/DROOLS-1165

我通过在将规则传递给Drools之前将以下行添加到规则中来修复此问题:

declare DataStreamRecord @role( event ) @expires( 10s ) end

以下是一个例子:

 String drl = "package org.test.common.beans;\r\n"+
 "rule my_rule \r\n"+ 
 "when\r\n"+ 
 "$streamRecord:DataStreamRecord()\r\n"+
 "then\r\n"+ 
  "System.out.println(\"Received data:\" + $streamRecord);\r\n"+
  "end"+
  " declare DataStreamRecord @role( event ) @expires( 10s ) end  ";        

	KieServices ks = KieServices.Factory.get();
	KieFileSystem kfs =
 ks.newKieFileSystem().write(ResourceFactory.newByteArrayResource(drl.getBytes())