Я использую 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]
Есть ли способ использовать переменные вместо жесткого кодирования в виде строки?Спасибо.