2013-07-17 3 views
1

Я новичок в 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 для обработка событий. Может ли кто-нибудь объяснить выход и сказать мне, где я ошибаюсь. Благодаря!

ответ

0

Я уверен, что вы сделали, но просто хотел проверить, что вы явно задать тип часов псевдо, а не в реальном времени по умолчанию:

KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(); 
config.setOption(ClockTypeOption.get("pseudo"));

Там также может быть проблема с просто заходящих fireAllRules() один раз после нескольких вызовов в advanceTime(). Вы можете запустить fireUntilHalt() в отдельном потоке или вызвать fireAllRules() после каждого вызова advanceTime().Проверить эту ссылку:

Drools Fusion Samples

0

с кодами предоставленных Вами, я получаю ожидаемый результат:

CRITICAL предупреждение вызвано событием: e1
CRITICAL предупреждение вызвано событием: e3


версия Drools: 5.5.0-final

Смежные вопросы