Drools 事实组的不同伪时钟

Drools 事实组的不同伪时钟,drools,drools-fusion,Drools,Drools Fusion,我是drools/fusion(7.x)的新手,不知道如何解决这个问题。假设事件对象为event{long:timestamp,id:string},其中id标识物理资产(如拖拉机),timestamp表示相对于资产触发事件的时间。在我的场景中,这些事件不会“实时”到达我的系统,这意味着它们可能会延迟几秒钟、几分钟甚至几天。我的规则系统需要监控多个资产。有鉴于此,当规则被评估时,时钟需要相对于被监控的资产,它不能是跨越资产的时钟。 我知道伪时钟,有没有办法为每个资产分配伪时钟 我的假设是,一个时

我是drools/fusion(7.x)的新手,不知道如何解决这个问题。假设事件对象为event{long:timestamp,id:string},其中id标识物理资产(如拖拉机),timestamp表示相对于资产触发事件的时间。在我的场景中,这些事件不会“实时”到达我的系统,这意味着它们可能会延迟几秒钟、几分钟甚至几天。我的规则系统需要监控多个资产。有鉴于此,当规则被评估时,时钟需要相对于被监控的资产,它不能是跨越资产的时钟。 我知道伪时钟,有没有办法为每个资产分配伪时钟

我的假设是,一个时钟必须总是前进,否则时间函数将无法正常工作。以以下场景为例: 资产1的事实A在1:00到达,它被插入内存并触发规则。然后事实B在2:00到达同一资产1。它也会被插入并触发规则。现在事实Z在1:30到达资产2(-30分钟)。我假设我不应该简单地将时钟向后推进并进行评估,而且我希望将时钟设置回2:00,因为这是我收到的“最新”数据。现在假设我正在监视数千个资产,所有资产都在不同的时间发送数据

我能想到的解决这个问题的最好方法是为每个资产保留一个时钟,然后在评估每个资产数据时保存引擎状态。单个会话可以有不同的时钟,还是在容器级别


示例规则:当同一资产的事实1在事实2之后到达时。

您处理问题的方式不正确。无论您使用的是实时时钟还是虚拟时钟,您都在使用时钟。你不能说“事实1使用时钟A,事实2使用时钟B。”

相反,您应该利用,特别是
@timestamp
标记。此标记向Drools指出,事件内部的特定字段实际上是事件的时间戳,而不是事实进入工作内存的实际时间

例如:

import com.example.SampleEvent

declare SampleEvent
  @role( event )
  // this field is actually in the object, it's not the time the fact was inserted
  @timestamp( createdDateTime ) 
end
我不知道您的规则实际上在做什么,这里我可以预见的主要问题是,如果您的规则依赖于时态运算符或定义过期(
@expires
),它们将无法工作,您需要重新设计它们。特别是对于过期事件:一旦事件过期,它将从工作记忆中删除;当您的带外事件进入时,任何以前过期的事件都已消失,无法处理


当然,不管您使用的是
@timestamp
还是您最初的“不同的psuedo时钟”计划,这种担心都是正确的。无论哪种方式,您都必须管理事件不能永远存在于工作内存中这一事实——您最终将耗尽资源,系统将崩溃。事件必须在某个时候被逐出,因此您需要在模型和规则中围绕这一点进行设计。

因此,您的问题就更没有意义了@时间戳是输入“不同步”事件的方式。一天结束时,你只有一个时钟;时间戳允许您自定义事件发生的时间。我添加了额外的详细信息,因为它很长,我不想在评论中添加它。