Drools 7.12.0: создание динамического условия времени - PullRequest
0 голосов
/ 26 декабря 2018

Я использую 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

После выполнения этого правила мы получаем исключения:

Исключение или ошибка привели к прерыванию запуска: Ошибка разбора строки времени: [$ event1.ActiveAt] at org.drools.core.time.TimeUtils.parseTimeString (TimeUtils.java:132)

org.drools.core.time.TimeUtils использует регулярное выражение для сопоставления этих интервалов, и кажется, что реализация отсутствует, с закомментированным кодом для разбора дат из ISO8601.

// ISO 8601-совместимый //private static final Pattern ISO8601 = Pattern.compile ("(P ((\ d +) [Yy])? ((\ d +) [Mm])? ((\ d +) [Dd])?)? (T ((\d +) [Hh])? ((\ d +) [Mm])? ((\ d +) [Ss])? ((\ d +) ([Mm] [Ss])?)?)? ");

Та же ошибка при использовании toString в поле Date.

Наша цель - использовать выведенный интервал, который объявлен внутри события, и избежать жесткого кодирования периода в правиле, так какэтот интервал зависит от события.

Обычно (во всех рассмотренных примерах) мытакое жесткое кодирование интервалов this after [0s, 3m]

Есть ли способ использовать переменные вместо жесткого кодирования в виде строки?Спасибо.

...