Я новичок в Drools. Я пытаюсь написать простое приложение для обработки сложных событий (CEP) с помощью Drools Fusion.Обработка событий
Мое требование
- on receipt of a CRITICAL event, perform an action (right now that's a SOP)
- if another CRITICAL event arrives within 5 minutes of the previous event
and from the same source, ignore it
У меня есть простой класс событий, который выглядит следующим образом:
public class Event {
private String id;
private Date timestamp;
private String source;
private Event.Severity severity;
private String description;
/// With Getter and Setter ///
}
Файл правил выглядит следующим образом:
declare Event
@role(event)
end
rule "Alert for CRITICAL events. Don't alert for the next 5 minutes if
from the same source"
when
$ev1: Event($source: source, severity == Event.Severity.CRITICAL)
from entry-point "events"
not (
Event(this != $ev1, source == $source,
severity == Event.Severity.CRITICAL,
this before [1ms, 5m] $ev1) from entry-point "events"
)
then
System.err.println("###### CRITICAL alert caused by event: "
+ $ev1.getId());
end
Для тестирования я вводя 4 события в рабочую память - e1, e2, e3, e4 соответственно со следующей временной шкалой 0m, 4m, 10m, 12m.
Jave Класс File
Event event1 = new Event("e1", new Date(), "server1",
Event.Severity.CRITICAL, "server down");
//calendar.add(Calendar.MINUTE, 4);
Event event2 = new Event("e2", new Date(), "server1",
Event.Severity.CRITICAL, "server down");
//calendar.add(Calendar.MINUTE, 6);
Event event3 = new Event("e3", new Date(), "server1",
Event.Severity.CRITICAL, "server down");
//calendar.add(Calendar.MINUTE, 2);
Event event4 = new Event("e4", new Date(), "server1",
Event.Severity.CRITICAL, "server down");
eventsEP.insert(event1);
clock.advanceTime(4, TimeUnit.MINUTES);
eventsEP.insert(event2);
clock.advanceTime(6, TimeUnit.MINUTES);
eventsEP.insert(event3);
clock.advanceTime(2, TimeUnit.MINUTES);
eventsEP.insert(event4);
ksession.fireAllRules();
Я ожидаю, что e1 передать власть, так как он не имеет предшествующее событие. Я также ожидаю, что e3 пройдет, поскольку предыдущее событие продлится на 6 минут.
Однако, я получаю другой вывод:
Ожидая выхода
- CRITICAL оповещение по событию: e1
- CRITICAL предупреждение вызвано событием: e3
Но я получаю
- CRITICAL предупреждение вызвано событием: e1
- CRITICAL предупреждение вызвано событием: e2
- CRITICAL предупреждение вызвано событием: e3
информация Дополнение: Я использую режим STREAM для обработка событий. Может ли кто-нибудь объяснить выход и сказать мне, где я ошибаюсь. Благодаря!