Drools 7.12.0:创建动态时间条件

时间:2018-12-26 17:52:52

标签: java event-handling real-time drools drools-fusion

我正在使用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? 谢谢。

0 个答案:

没有答案