流模式下的流口水: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 文件中没有看到查询。
希望对您有所帮助,
我的 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 文件中没有看到查询。
希望对您有所帮助,