与esper

时间:2016-10-25 10:05:15

标签: esper cumulocity

我正在测试我在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发动机有什么区别?我怎么做才能让这个工作像我认为的那样工作?

1 个答案:

答案 0 :(得分:0)

可能是偶然的问题,esper在线工具总是处理最后一个事件但是积累 - 前一个。

发生哪种情况取决于首先执行哪个语句(“create_context或”context_end“)。但是,除非提供@Priority注释,否则语句执行的顺序是随机的。

根据esper文档(http://www.espertech.com/esper/release-5.3.0/esper-reference/html/context.html#context_def_nonoverlapping

中的说明
  

如果您指定了事件过滤器或模式作为上下文分区的结束条件,并且引用上下文的语句指定了匹配相同条件的事件过滤器或模式,请使用@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”语句。