1

我希望在我的应用程序中用 Siddhi 替换 Esper。现在的 esper 语句是一种“超时”类型模式,当具有唯一“名称”和“类型”的事件(我可以在传入事件中查找的字符串值)到达和离开时,我需要报告回来。我知道当事件第一次到达我的第一个唯一窗口时事件已经到达,并且我假设如果我没有看到任何同名的事件并输入用户定义的超时值,事件就会离开。这是我的 esper 语句的样子(请注意,在实际的 esper 中还有很多事情要做,我只是为了举例而简化了这个):

创建窗口 events_1.std:firstunique(name, type) 作为 NameEvent

插入 events_1 从 EventCycle [events] 中选择 *

在模式 [每个 event1=events_1->(timer:interval(4.0 sec) 而不是 events_1(name=event1.name, type=event1.type))] 从 events_1 中删除 name = event1.name AND type=event1.type

然后我从 events_1 中选择 irstream 并通过获取传入和删除的事件,然后从窗口中获取“到达”和“离开”事件。

对于 siddhi,第一个独特的窗口相当简单(我认为?):

从 EventCycle#window.firstUnique('name')[ type=='type' ] 选择名称,输入插入到 NameEvent

但我真的对如何用 Siddhi 替换那个 esper “on pattern”一无所知。我可以为此使用一个“来自每个”的声明,还是需要对 Siddhi 采用不同的方法?

任何帮助我走上正确道路的帮助将不胜感激!

4

1 回答 1

0

实现您的要求的一种方法是检查事件的不发生。恐怕,AFAIK,WSO2 CEP-3.1.0 不支持非出现检查。
然而,它在 WSO2 CEP-4.0.0 中得到支持(我在 2015 年 8 月 24 日写这篇文章时尚未发布)。您可以参考非发生检测示例[1]

解释:

在这里,如果在最近的唯一事件发生后4 秒(即超时)没有发生唯一事件,我们将离开第一个事件。所以看起来我们需要检查一个事件的不发生。

在 CEP 4.0.0 中,您可以按如下方式实现您的要求:

from EventCycle#window.firstUnique(name)[ type=='type' ] 
select name, type 
insert into NameEvents;     -- Note: I renamed NameEvent in the question to NameEvents

-- After seeing the latest unique event (Query-A), 4 seconds later (Query-B), we're checking if no unique event has occured in between (Query-C and Query-D). 
-- So, we're checking the non-occurance of an event here... See link [1] for a sample.

--Query-A
from EventCycle#window.unique(name)[ type=='type' ] 
select name, type 
insert into latestEvents;

-- Query-B
from latestEvents#window.time(4 seconds)    -- Here, I've taken 4 seconds as the timeout.
select *
insert expired events into timedoutEvents;

-- Query-C
from every latestEvent = latestEvents[ type=='type' ] ->
keepAliveEvent = latestEvents[ latestEvent.name == keepAliveEvent.name and type=='type' ] 
    or timedoutEvent = timedoutEvents[ latestEvent.name == timedoutEvent.name and type=='type' ]
select latestEvent.name as name, keepAliveEvent.name as keepAliveName
insert into filteredEvents;

-- Query-D
from filteredEvents [ isNull(keepAliveName)]  
select name
insert into departedLatestEvents;


-- Since we want the name from the NameEvents stream, we're joining it with the departedLatestEvents stream

from departedLatestEvents#window.length(1) as departedLatestEvent join 
NameEvents#window.length(1) as NameEvent 
on departedLatestEvent.name == NameEvent.name       -- not checking type as both departedLatestEvents and NameEvents have events only with type 'type'  
select NameEvent.name as name, 'type' as type
insert into departedFirstEvents;

代码示例中引用的链接:

1 https://docs.wso2.com/display/CEP400/Sample+0111+-+Detecting+non-occurrences+with+Patterns

希望这可以帮助!

于 2015-08-23T21:53:17.980 回答