注意:调用ctx.getEventsForPattern(...)会找到给定潜在匹配项的所有先前接受的事件。 该操作的成本可能会有所不同,因此在实施时,请尽量减少其使用。
所描述的上下文也使事件时间特性具有一种访问方式。 有关更多信息,请参见时间上下文。
简单条件:这种类型的条件扩展了前面提到的IterativeCondition类,并仅基于事件本身的属性来决定是否接受事件。
start.where(event => event.getName.startsWith("foo"))
最后,您还可以通过pattern.subtype(subClass)方法将接受事件的类型限制为初始事件类型的子类型(此处为Event)。
start.subtype(classOf[SubEvent]).where(subEvent => ... /* some condition */)
组合条件:如上所示,您可以将子类型条件与其他条件组合。 这适用于所有条件。 您可以通过顺序调用where()任意组合条件。 最终结果将是各个条件结果的逻辑与。
要使用OR合并条件,可以使用or()方法,如下所示。
pattern.where(event => ... /* some condition */).or(event => ... /* or condition */)
停止条件:如果是循环模式(oneOrMore()和oneOrMore()。optional()),您还可以指定停止条件,例如 接受值大于5的事件,直到值的总和小于50。
为了更好地理解它,请看以下示例。
"(a+ until b)"
(一个或多个"a"
直到"b"
)的模式
添加与现有条件进行“或”运算的新条件。 一个事件只有通过至少一个条件才能匹配模式:
pattern.where(event => ... /* some condition */)
.or(event => ... /* alternative condition */)
until(condition)
指定循环模式的停止条件。 意味着如果发生符合给定条件的事件,则模式中将不再接受任何事件.
仅与oneOrMore()结合使用
注意:它允许在基于事件的情况下为相应的模式清除状态.
pattern.oneOrMore().until(event => ... /* some condition */)
subtype(subClass)
定义当前模式的子类型条件。 如果事件属于此子类型,则该事件只能与该模式匹配:
pattern.subtype(classOf[SubEvent])
oneOrMore()
指定此模式期望至少发生一次匹配事件.
默认情况下,使用宽松的内部连续性(在后续事件之间)。 有关内部连续性的更多信息,请参见连续.
注意:建议使用until()或within()来启用清除状态
pattern.oneOrMore()
timesOrMore(#times)
指定此模式期望至少出现 #times 次匹配事件.
默认情况下,使用宽松的内部连续性(在后续事件之间)。 有关内部连续性的更多信息,请参见连续.
pattern.timesOrMore(2)
times(#ofTimes)
指定此模式期望发生匹配事件的确切次数.
默认情况下,使用宽松的内部连续性(在后续事件之间)。 有关内部连续性的更多信息,请参见连续.
pattern.times(2)
times(#fromTimes, #toTimes)
指定此模式期望匹配事件的#fromTimes和#toTimes之间发生.
默认情况下,使用宽松的内部连续性(在后续事件之间)。 有关内部连续性的更多信息,请参见连续.
pattern.times(2, 4)
optional()
指定此模式是可选的,即它可能根本不会发生。 这适用于所有上述量词.
pattern.oneOrMore().optional()
greedy()
指定此模式为贪婪模式,即将重复尽可能多的匹配。 这仅适用于量词,目前不支持分组模式.
pattern.oneOrMore().greedy()
val start : Pattern[Event, _] = Pattern.begin("start")
接下来,可以通过在模式序列之间指定所需的连续性条件,将更多模式附加到模式序列中。FlinkCEP支持以下事件之间的连续性形式:
严格连续性:期望所有匹配事件严格地一个接一个地出现,而中间没有任何不匹配事件。
宽松连续性:忽略在匹配事件之间出现的不匹配事件。
非确定性宽松连续性:进一步的宽松连续性,允许其他匹配忽略某些匹配事件。
要在连续模式之间应用它们,可以使用:
next()
为严格的
followedBy()
为宽松的
followedByAny()
,用于不确定的宽松邻接