流模式下的流口水:karaf 中的 OutOfMemory

Drools in stream mode : OutOfMemory in karaf

我的 DRL 文件:

package com.sample.eventmanagement;

import com.sample.eventmanagement.CheckInEvent    
import com.sample.eventmanagement.LateCheckInEvent     

global java.util.concurrent.BlockingQueue lateCheckInEntitiesQueue;    
global java.util.concurrent.BlockingQueue clearingLateCheckInEntitiesQueue;    

declare CheckInEvent    
 @role(event)    
 serialNum : String    
 currentCheckInTime : long    
end    

declare LateCheckInEvent    
 @role(event)    
 @expires( 120m )    
 serialNum : String    
 currentCheckInTime : long    
end    

rule "Raising an Late Check-In Alert"    
when     
    $s1: CheckInEvent( $serialNum : serialNum, $currentCheckInTime: currentCheckInTime ) from entry-point apCheckInStream    
    not( CheckInEvent( serialNum == $serialNum, currentCheckInTime > $currentCheckInTime, this after[ 1s, 360s ] $s1 ) from entry-point apCheckInStream)     
then     
    lateCheckInEntitiesQueue.add($s1);    
end    

rule "Clearing Late Check-In Alert"    
when     
    $s1: LateCheckInEvent( $serialNum : serialNum, $currentCheckInTime: currentCheckInTime ) from entry-point lateApCheckInStream    
    CheckInEvent( serialNum == $serialNum, currentCheckInTime > $currentCheckInTime) from entry-point clearingApCheckInStream    
then     
    System.out.println("Clearing late checkin " + $s1);    
    clearingLateCheckInEntitiesQueue.add($s1.getSerialNum());    
end

我 运行 在 linux vm 中的 karaf 2.4.3 流模式下流口水,每 5 分钟报告一次 10k 实体检查事件内存不足。

我的用例是检测由序列号标识的实体的延迟检查事件。延迟签入事件检测到将该事件抽到另一个规则,并等待 2 小时内从该实体再次正确签入。如果发生这种情况,则触发规则 2。

我写查询的方式有什么问题吗? ?

事实将保留在您的会话中(在内存中)直到:

  • 您手动收回它们:使用 delete()retract()
  • 引擎收回作为其真相维护系统的一部分:即逻辑插入的事实。
  • CEP 引擎(融合)检测到,由于所涉及的限制,会话中不再需要标记为 @expires 的事实。

您的场景似乎不属于这 3 种情况中的任何一种。

** 顺便说一句,我在你的 DRL 文件中没有看到查询。

希望对您有所帮助,