我正在使用Drools以实时流模式创建和触发规则。
所有事实(事件)均按时间顺序插入,已经包含创建时间戳@timestamp( createdAt )
(接近实时)和激活时间戳activeAt
我创建了带有时间条件的简单规则(* .drl文件)。
“事件2在event1.activeAt + 3分钟之间发生”
rule "Event 2 happens between event1 activation + 3 minutes"
when
$event1: EventType1($actAt: activeAt)
not(
$event2: EventType2(linkId == $event1.linklId, this after [$event1.ActiveAt, 3m])
)
then
insert(new ALARM()) //Simple reaction
end
运行此规则后,我们会得到例外:
异常或错误导致运行中止:解析时间字符串:org.drools.core.time.TimeUtils.parseTimeString(TimeUtils.java:132)处的[$ event1.ActiveAt]
org.drools.core.time.TimeUtils使用正则表达式来匹配这些间隔,并且似乎缺少实现,并带有注释代码,用于解析ISO8601中的日期。
//符合ISO 8601 //私有静态最终模式ISO8601 = Pattern.compile(“(P((\ d +)[Yy])?((\ d +)[Mm])?((\ d +)[Dd])?)?(T( (\ d +)[Hh])?((\ d +)[Mm])?((\ d +)[Ss])?((\ d +)([Mm] [Ss])?)?)?)
在“日期”字段上使用toString
时出现相同的错误。
我们的目标是使用在事件内部声明的推断间隔,并避免对规则中的句点进行硬编码,因为此间隔取决于事件。
通常(在所有示例中),我们都在对间隔this after [0s, 3m]
进行硬编码
有没有一种方法可以使用变量而不是硬编码为String? 谢谢。