首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件处理

事件处理
EN

Stack Overflow用户
提问于 2013-07-17 13:08:17
回答 2查看 407关注 0票数 1

我刚开始流口水。我正在尝试使用Drools编写一个简单的复杂事件处理(CEP)应用程序。

我的要求是

代码语言:javascript
复制
  - 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

我有一个简单的事件类,如下所示:

代码语言:javascript
复制
public class Event {

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

 /// With Getter and Setter ///

}

规则文件如下所示:

代码语言:javascript
复制
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类文件

代码语言:javascript
复制
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

添加信息:我使用流模式进行事件处理。有人能解释一下输出结果并告诉我哪里错了吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-07-24 17:38:30

我肯定您做了,但只想检查您是否显式地将时钟类型设置为伪的,而不是默认的实时时间:

代码语言:javascript
复制
KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );

在多次调用fireAllRules()之后,只调用advanceTime()一次也可能会出现问题。您可能希望在单独的线程中运行fireUntilHalt(),或者在每次调用advanceTime()之后调用advanceTime()。请查看以下链接:

Drools融合样本

票数 0
EN

Stack Overflow用户

发布于 2013-12-06 17:38:49

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

事件引发的临界警报: e1

事件引发的临界警报: e3

口水版本:5.5.0-最终版本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17700656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档