![](/img/trans.png)
[英]Java NoClassDefFoundError : Apache Flink Complex Event Processing
[英]Stateful Complex event processing with apache flink
我想基于两个具有相同标识符的事件来检测是否在定义的时间范围内发生了两个事件。 例如, DoorEvent
看起来像这样:
<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类具有相同的结构。
我想检测到ID为1的门在打开后5分钟内关闭。 为此,我尝试使用Apache flink CEP库。 传入的流包含假设有20个门的所有打开和关闭消息。
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));
如何在door_open
门1的状态保存为打开状态,以便在door_close
步骤中知道门1是正在关闭的门,而不是其他门?
如果您拥有Flink 1.3.0及其更高版本,那么您想要做的事情
您的模式如下所示:
Pattern.<DoorEvent>begin("first")
.where(new SimpleCondition<DoorEvent>() {
private static final long serialVersionUID = 1390448281048961616L;
@Override
public boolean filter(DoorEvent event) throws Exception {
return event.getDoor().getStatus().equals("open");
}
})
.followedBy("second")
.where(new IterativeCondition<DoorEvent>() {
private static final long serialVersionUID = -9216505110246259082L;
@Override
public boolean filter(DoorEvent secondEvent, Context<DoorEvent> ctx) throws Exception {
if (!secondEvent.getDoor().getStatus().equals("close")) {
return false;
}
for (DoorEvent firstEvent : ctx.getEventsForPattern("first")) {
if (secondEvent.getDoor().getEventID().equals(firstEvent.getDoor().getEventId())) {
return true;
}
}
return false;
}
})
.within(Time.minutes(5));
因此,基本上,您可以使用IterativeConditions并获取匹配的第一个模式的上下文,并在该列表上进行迭代,同时比较所需的模式并根据需要进行操作。
迭代条件很昂贵,应该相应地处理
有关条件的更多信息,请在此处查看Flink-条件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.