我正在测试我在QuarkIoE中编写的一些规则,因为我无法得到我想要的结果,所以我尝试使用Esper EPL online tool进行比较。事实证明,我发现两者之间的输出存在差异,我无法解释。
基本上,我想要做的是创建一个由源分区并由" start"分隔的上下文。并且"停止"事件。然后当我的上下文结束时,我想只显示我的开始和结束事件的一些细节(类型和时间)(我现在不关心其间的事件)。
这是我的规则(必须为QuarkIoE删除创建模式,因为它们已经定义并且#34;本地"):
create schema EventCreated(
source String,
type String,
time Date
);
create schema CreateMeasurement(
source String,
type String,
time Date,
fragments Object
);
@Name("create_context")
create context Trip
context bySource
partition by source from EventCreated,
context byEvents
start EventCreated(
type = "c8y_ObdConnectionReport" or
type = "c8y_PowerOnReport" or
type = "c8y_FixedReport" or
type = "c8y_HarshBehaviorReport") as startEvent
end EventCreated(
type = "c8y_ObdDisconnectionReport" or
type = "c8y_PowerOffReport" or
type = "c8y_SilentTracker") as endEvent;
@Name("context_end")
context Trip
insert into
CreateMeasurement
select
context.bySource.key1 as source,
"Trip" as type,
e.time as time,
{
"startedBy", context.byEvents.startEvent.type,
"startedAt", context.byEvents.startEvent.time,
"endedBy", e.type,
"endedAt", e.time
} as fragments
from
EventCreated e
output
last when terminated;
这是一个简单的事件序列,可以看出差异:
EventCreated = {
source = '1672192',
type = 'c8y_ObdConnectionReport',
time = '2016-10-07T10:00:00.000'
}
t = t.plus(5 minutes)
EventCreated = {
source = '1672192',
type = 'c8y_FixedReport',
time = '2016-10-07T10:05:00.000'
}
t = t.plus(5 minutes)
EventCreated = {
source = '1672192',
type = 'c8y_ObdDisconnectionReport',
time = '2016-10-07T10:10:00.000'
}
所以这是使用EPL在线模拟器的结果:
At: 2016-10-07 10:05:00.000
Statement: context_end
Insert
CreateMeasurement={
source='1672192',
type='Trip',
time='2016-10-07T10:05:00.000',
fragments[
'startedBy','c8y_ObdConnectionReport',
'startedAt','2016-10-07T10:00:00.000',
'endedBy','c8y_ObdDisconnectionReport',
'endedAt','2016-10-07T10:10:00.000']}
这就是我想要的,我按照预期从第一次和最后一次活动中得到了详细信息。现在这就是我使用Cumulocity所得到的:
{
"source":{
"id":"1672192",
"name":"Tracker 123456789000000",
"self":"http://tracker.post-iot.lu/inventory/managedObjects/1672192"},
"type":"Trip",
"time":"2016-10-25T11:56:46.983+02:00",
"self":"http://tracker.post-iot.lu/measurement/measurements/null",
"startedBy":"c8y_ObdConnectionReport",
"startedAt":"2016-10-25 11:56:44+0200",
"endedBy":"c8y_FixedReport",
"endedAt":"2016-10-25 11:56:46+0200"
}
(忽略日期,我和Cumulocity一起实时工作)。 如您所见,它将最后一个事件视为FixedReport而不是DisconnectionReport。所以在QuarkIoE(我已经尝试了各种情况)中基本上发生了什么,每次都会忽略上下文的结束事件,所以我只能检索倒数第二个事件。
这与Esper发动机有什么区别?我怎么做才能让这个工作像我认为的那样工作?
答案 0 :(得分:0)
可能是偶然的问题,esper在线工具总是处理最后一个事件但是积累 - 前一个。
发生哪种情况取决于首先执行哪个语句(“create_context或”context_end“)。但是,除非提供@Priority注释,否则语句执行的顺序是随机的。
中的说明如果您指定了事件过滤器或模式作为上下文分区的结束条件,并且引用上下文的语句指定了匹配相同条件的事件过滤器或模式,请使用@Priority指示引擎是否上下文管理或者语句评估优先(参见下面的配置优先级执行)。 例如,如果您的上下文声明如下所示:
create context MyCtx start MyStartEvent end MyEndEvent
由上下文管理的声明是:
context MyCtx select count(*) as cnt from MyEndEvent output when terminated
通过对计数语句使用@Priority(1)和对计数语句使用@Priority(0),计数语句不计算最后一个MyEndEvent,因为上下文分区管理优先。 通过对计数语句使用@Priority(0)和计数语句使用@Priority(1),计数语句将计算最后一个MyEndEvent,因为语句评估优先。
修复:将@Priority(0)添加到“create_context”语句,将@Priority(1)添加到“context_end”语句。