2013-07-17 65 views
1

我是新来的Drools。我正在尝试使用Drools Fusion编写一个简单的复杂事件处理(CEP)应用程序。活动处理

我的要求是

- 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类文件

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分钟。

但是,我得到不同的结果:

期待所造成的事件输出

  • 严重警报:E1
  • 严重警报引起的事件:E3

但我越来越

  • 严重警报引起的事件: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-final