我正在使用Drools 6.3.0.Final在不同的KieSession中运行100条规则,每个会话一条规则,并且引擎在STREAM模式下工作。我在代码级别使用注释@Expires来定义我在会话中推送的Pojo的生命周期。
问题是在运行应用程序几个小时之后,我注意到内存泄漏,通过分析堆转储,我可以看到数百万个Poro从Drool Sessions中引用。这意味着Pojos不会从会话中删除。
知道如何解决这个问题吗?
这是我的Pojo:
@Role(Role.Type.EVENT)
@Expires("10s")
public class DataStreamRecord {
......
.....
}
答案 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())