事实组的不同伪时钟

如何解决事实组的不同伪时钟

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

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

我认为解决此问题的最佳方法是为每个资产保留一个时钟,然后在评估每个资产数据时保存引擎状态。单个 KieSession 可以有不同的时钟,还是在容器级别?

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

解决方法

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

相反,您应该利用 metadata tags for events,特别是 @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 还是您最初的“不同的伪时钟”计划,这种担忧都是真实的。无论哪种方式,您都必须管理这样一个事实,即事件不能永远存在于工作内存中——您最终将耗尽资源并且您的系统将崩溃。必须在某个时刻驱逐事件,因此您需要在模型和规则中围绕这一点进行设计。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?