0

使用 Siddhi 3.0.3 作为 Java 库。

我通过扩展类开发了自定义聚合函数,并且在调用方法AttributeAggregator后我看到了一些奇怪的行为。processRemove()processRemove()被调用时,我删除该值并返回新的聚合结果。但是,结果处理程序返回的事件仍在接收旧值。但是,processAdd()工作正常。经过一些调试,我注意到在每次调用 之后processAdd(),结果事件都包含上次调用返回的对象processAdd()。但是,在调用 之后processRemove(),该事件包含与之前相同的对象(来自 lastprocessAdd()的对象),而不是返回的最后一个对象processRemove()

如果我维护一个集合,从其中添加删除并始终返回相同的集合对象,那么一切都很好。但是对于返回数值的聚合函数,每个processAdd()/processRemove()返回一个 boxed Long,它不会被 return from 替换processRemove()

我还注意到使用内置聚合函数的相同行为count()

4

1 回答 1

1

属性聚合器用于执行有状态的操作,如求和、平均、事件集合的计数,准确地说是窗口。让我解释一下这些属性聚合器的行为。

可以收集事件的 Windows 会发出两种类型的事件。当前和过期。当前事件是刚刚进入窗口的事件。过期事件是为新出现的事件腾出空间而过期的事件。因此,在窗口达到其阈值后,它将始终发出过期事件,然后是当前事件。这个过期事件和当前事件会在同一个EventChunk中,但是过期事件总是在当前事件的前面。

因此,在查询选择器级别,当我们调用属性聚合器时,processRemove 将首先被调用,然后总是跟在 processAdd 之后。除非有分组依据,否则查询选择器将仅保留要发送的最后一个事件作为输出。因此,如果您正在查看查询选择器的输出,您将始终看到最后一个事件,该事件具有由 processAdd 返回的对象。

这是 Siddhi 的默认行为。如果此行为不符合要求,请说明您的要求。我们将能够帮助您!

问候

于 2016-03-06T18:28:37.537 回答