Drools 事件处理

Drools 事件处理,drools,drools-fusion,Drools,Drools Fusion,我不太会流口水。我正在尝试使用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 i

我不太会流口水。我正在尝试使用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
我有一个简单的事件类,如下所示:

规则文件如下所示:

为了进行测试,我将向工作内存中注入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 附加信息:我正在使用流模式进行事件处理。
谁能解释一下输出,告诉我哪里错了。谢谢

我相信您确实这样做了,但我只是想检查一下是否将时钟类型显式设置为伪时钟,而不是默认的实时时钟:

KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );
在多次调用advanceTime之后只调用fireAllRules一次也可能存在问题。您可能希望在单独的线程中运行Fireuntlhalt,或者在每次调用advanceTime后调用fireAllRules。查看此链接:


通过您提供的代码,我得到了预期的输出:

事件引起的严重警报:e1 事件引起的严重警报:e3 Drools版本:5.5.0-final

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();
KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );