CEPのアプリケーションニーズに合わせてESPERを実装しました。EPLを使用しているときに、次のような特定のシナリオに遭遇しました。
2つのイベントを左外部結合と組み合わせて、最初の各イベントがステートメントをトリガーでき、特定のプロパティを含む2番目のストリームのイベントのみが発生するようにしました。いくつかのフィールドに基づいて一意のデータを格納するためのビューを作成しました。私の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;
構成ファイルのCombinedEventdataTypeにjava.util.Mapタイプを使用しています
次に、テストシナリオを検討します
- IDが異なるが同じ名前のタイプT1の2つのイベントがシステムに入力されました
- タイプT2の1つのイベントがシステムに入力されます
ビュー仕様により、タイプT1の両方のイベントがビューに存在し、タイプT2のイベントがシステムに入ると、タイプEvent BeanのNewDataパラメーターにはT1の両方のイベントが含まれます(コードでイベントリスナーを使用していた場合)が、最初のEPLステートメントとして'StmtGroupingEvent'に対してタイプT2のイベントを予期していたが、代わりにイベントBeanを検出したため、2番目のステートメントに挿入するように指定します。タイプが一致しないエラーを検出します。
そのため、EPLで配列型のデータを処理する必要があります。これは面倒です。
一方、シナリオが次の場合:
- タイプT1の1つのイベントのみがシステムに入力されます。
- タイプT2の1つのイベントがシステムに入力されます。
このシナリオでは、イベントBeanがタイプT2にタイプキャストされたため、エラーは発生しません。
だから私にこれを行う別の方法を提案してください。
ありがとう