0

我已经为我的 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 数据类型

现在考虑测试场景

  1. 已将两个 Id 不同但名称相同的 T1 类型事件输入系统
  2. 一个 T2 类型的事件进入系统

由于视图规范,T1 类型的两个事件都驻留在视图中,并且当 T2 类型的事件进入系统时,Event Bean 类型的 NewData 参数包含 T1 的两个事件(如果我在代码中使用事件侦听器),但作为第一个 EPL 语句指定它插入到第二个语句中,它发现类型不匹配的错误,因为它期待“StmtGroupingEvent”的类型为 T2 的事件,但找到了事件 Bean。

所以我需要在 EPL 中处理数组类型的数据,这很麻烦。

另一方面,如果场景如下:

  1. 只有一个 T1 类型的事件进入系统。
  2. 一个 T2 类型的事件进入系统。

此方案不会产生任何错误,因为事件 Bean 已成功类型转换为 T2 类型。

所以请建议我这样做的任何替代方式。

谢谢

4

1 回答 1

0

“它发现类型不匹配的错误”是什么意思?如果记录了异常,请将其发布并在旁边发布一个小型测试类以进行重现。还要确保您使用的是最新版本的 Esper,如果有错误,它可能已在较新版本中修复。

另外,使用“from bussinessObject.Type1.std:unique(S.Id)”而不是 pattern[every S= bussinessObject.Type1].std:unique(S.Id)”,因为后者是一个直线,它是相同的。

于 2012-10-19T11:09:56.453 回答