2013-07-17 2 views
1

Drools를 처음 사용했습니다. Drools Fusion을 사용하여 간단한 CEP (Complex Event Processing) 응용 프로그램을 작성하려고합니다. 다음과 같이이벤트 처리

public class Event { 

    private String id; 
    private Date timestamp; 
    private String source; 
    private Event.Severity severity; 
    private String description; 

/// With Getter and Setter /// 

} 

규칙 파일은 다음과 같습니다 :

내 요구 사항은 다음과 같이

- 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 

내가하는 간단한 이벤트 클래스가 있습니다

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 

테스트를 위해 4m 이벤트를 각각 0m, 4m, 10m, 12m의 타임 라인으로 작업 메모리 - e1, e2, e3, e4에 주입합니다. 나는 그것이 더 앞의 이벤트가 없기 때문에 규칙을 통과 E1 기대

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(); 

Jave 클래스 파일. 선행 이벤트가 6 분 남았 기 때문에 e3도 통과 할 것으로 기대합니다. E1

  • 이벤트로 인한 위험 경고 : E3
  • 이벤트에 의한 출력

    • CRITICAL 경고를 기대 : 그러나

      , 나는 다른 출력을 얻을

      그러나 나는 받고있다

      • 이벤트로 인한 위험 경고 : E1
      • 이벤트로 인한 위험 경고 : E2
      • 이벤트로 인한 위험 경고 : E3

      추가 정보 : 나는 STREAM 모드를 사용하고 있습니다 이벤트 처리. 누구나 출력을 설명하고 내가 틀린 위치를 말해 줄 수 있습니까? 감사!

    답변

    0

    난 당신했지만 당신이 명시 적으로하여 유사하기 위해 시계 유형을 설정되었는지 확인하고 싶었다 아닌 기본 실시간 확신 :

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

    는 단지 전화 fireAllRules에 문제가있을 수 있습니다() advanceTime()에 대한 여러 번 호출 한 번. 각각의 스레드에서 fireUntilHalt()를 실행하거나 advanceTime()을 호출 할 때마다 fireAllRules()를 호출 할 수 있습니다.이 링크를 체크 아웃 : 당신이 제공하는 코드와

    Drools Fusion Samples

    0

    을, 나는 예상되는 출력을 얻을 :

    이벤트에 의해 발생 위험 경고 : E1
    이벤트로 인한 위험 경고 : E3


    Drools 버전 : 5.5.0- 최종