同じ識別子を持つ2つのイベントに基づいて、定義された時間枠内に2つのイベントが発生したかどうかを検出したいと考えています。たとえば、DoorEvent
次のようになります。例ではステートフル複雑なイベント処理とapache flink
<doorevent>
<door>
<id>1</id>
<status>open</status>
</door>
<timestamp>12345679</timestamp>
</doorevent>
<doorevent>
<door>
<id>1</id>
<status>close</status>
</door>
<timestamp>23456790</timestamp>
</doorevent>
マイDoorEvent
Javaクラスは、以下の同様の構造を有しています。
開けて5分以内にid1のドアが閉じていることを検出したいと思います。私は、この目的のためにApache flink CEPライブラリを使用しようとしています。入ってくるストリームには、20個のドアからのすべての開いたメッセージと閉じたメッセージが含まれています。私はそのdoor_close
ステップで、私はドア1が閉鎖されている一つであり、それはいくつかの他のドアではないことを知っているdoor_open
のように開いたドア1の状態を保存するにはどうすればよい
Pattern<String, ?> pattern = Pattern.<String>begin("door_open").where(
new SimpleCondition<String>() {
private static final long serialVersionUID = 1L;
public boolean filter(String doorevent) {
DoorEvent event = new DoorEvent().parseInstance(doorevent, DataType.XML);
if (event.getDoor().getStatus().equals("open")){
// save state of door as open
return true;
}
return false;
}
}
)
.followedByAny("door_close").where(
new SimpleCondition<String>() {
private static final long serialVersionUID = 1L;
public boolean filter(String doorevent) throws JsonParseException, JsonMappingException, IOException {
DoorEvent event = new DoorEvent().parseInstance(doorevent, DataType.XML);
if (event.getDoor().getStatus().equals("close")){
// check if close is of previously opened door
return true;
}
return false;
}
}
)
.within(Time.minutes(5));
?