Drools 事件处理
我不太会流口水。我正在尝试使用Drools Fusion编写一个简单的复杂事件处理CEP应用程序 我的要求是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
- 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") );