0

我的 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 中以流模式运行 drools,每 5 分钟报告一次 10k 实体检查事件的内存不足。

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

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

4

1 回答 1

0

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

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

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

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

希望能帮助到你,

于 2015-12-20T14:33:55.910 回答