非跟随的Apache Flink CEP模式操作

时间:2016-04-12 12:45:57

标签: apache-flink flink-cep

我有一个场景,如果第二个事件在x秒内没有跟随第一个事件,我必须改变状态。对于例如用户没有在100分钟内退出,认为他处于无效状态。如何使用当前的模式操作来设计它?

2 个答案:

答案 0 :(得分:3)

由于这已经实施,我想为那些来这里寻找答案的人回答这个问题。

从Flink 1.0.0开始,这可以通过处理Timedout模式来完成,例如,如果您的CEP模式是这样的:

来自Flink Website的部分示例(1.2和1.3之间有一些重大变化请相应调整您的代码,此答案主要针对1.3)

  

模式描述: - 获取类型"错误"的第一个事件,然后是类型"关键"的第二个事件事件。在10秒内

Pattern<Event, ?> pattern = Pattern.<Event>begin("start")
.next("middle").where(new SimpleCondition<Event>() {
    @Override
    public boolean filter(Event value) throws Exception {
        return value.getName().equals("error");
    }
}).followedBy("end").where(new SimpleCondition<Event>() {
    @Override
    public boolean filter(Event value) throws Exception {
        return value.getName().equals("critical");
    }
}).within(Time.seconds(10));

PatternStream<BAMEvent> patternStream = CEP.pattern(inputStream, pattern)

DataStream<Either<String, String>> result = patternStream.select(new PatternTimeoutFunction<Event, String>() {
  @Override
  public String timeout(Map<String, List<Event>> map, long l) throws Exception {
    return map.toString() +" @ "+ l;
  }
}, new PatternSelectFunction<Event, String>() {

  @Override
  public String select(Map<String, List<Event>> map) throws Exception {
    return map.toString();
  }
});

对于这种情况,如果用户即使在100分钟后也没有注销,那么由于相应的事件不会到达,这将导致模式为超时和部分事件(发起事件)将在PatternTimeoutFunction中捕获。

答案 1 :(得分:2)

目前无法做到这一点。解决方案是有一个超时处理程序,只要事件序列被丢弃就会触发,因为它超出了定义的时间窗口。已经存在跟踪timeout handler实施的JIRA问题。