我已经为我的 CEP 应用需求实施了 ESPER。在使用 EPL 时,我遇到了一个特定的场景,如下所示:
我将两个事件与左外连接结合起来,以确保第一个事件中的每个事件都可以触发语句,并且只有包含特定属性的第二个流中的事件才能出现。我创建了一个视图来存储基于某些字段的唯一数据。我的 EPL 是
@Name ('StmtCombinedEvent')
Insert into CombinedEvent
Select S as T1,
L as T2,
From pattern[every S= bussinessObject.Type1].std:unique(S.Id) as S
left outer join
bussinessObject.Type2.std:unique(name) as L
on S.name = L.name;
@Name ('StmtGroupingEvent')
Insert into Position
Select
G.T1 as T1
G.T2 as T2
From CombinedEvent.std:unique(T1.Id) as G;
我在配置文件中使用 java.util.Map 类型作为 CombinedEvent 数据类型
现在考虑测试场景
- 已将两个 Id 不同但名称相同的 T1 类型事件输入系统
- 一个 T2 类型的事件进入系统
由于视图规范,T1 类型的两个事件都驻留在视图中,并且当 T2 类型的事件进入系统时,Event Bean 类型的 NewData 参数包含 T1 的两个事件(如果我在代码中使用事件侦听器),但作为第一个 EPL 语句指定它插入到第二个语句中,它发现类型不匹配的错误,因为它期待“StmtGroupingEvent”的类型为 T2 的事件,但找到了事件 Bean。
所以我需要在 EPL 中处理数组类型的数据,这很麻烦。
另一方面,如果场景如下:
- 只有一个 T1 类型的事件进入系统。
- 一个 T2 类型的事件进入系统。
此方案不会产生任何错误,因为事件 Bean 已成功类型转换为 T2 类型。
所以请建议我这样做的任何替代方式。
谢谢