Apache flink 如果在ApacheFlink中5秒内发现相同数据5次,则生成CEP事件

Apache flink 如果在ApacheFlink中5秒内发现相同数据5次,则生成CEP事件,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,如果我们发现字符串消息在5秒内连续5次以字符“a”开头,我需要生成CEP事件 Pattern<String, String> pattern = Pattern.<String> begin("start") .times(5).greedy().where(new SimpleCondition<String>() { private static final long serialVe

如果我们发现字符串消息在5秒内连续5次以字符“a”开头,我需要生成CEP事件

Pattern<String, String> pattern = Pattern.<String> begin("start")
                .times(5).greedy().where(new SimpleCondition<String>() {
                    private static final long serialVersionUID = -6301755149429716724L;

                    @Override
                    public boolean filter(String value) throws Exception {
                        return value.split(";")[0].equals("a");
                    }
                }).within(Time.seconds(5));
为此,我编写了一个类CEPCharEventPublisher.java,它将把字符串消息(如下Published message)发布到卡夫卡主题“charEvent”中

已发布消息:

b; date- 2019-06-27 09:05:09.605
a; date- 2019-06-27 09:05:10.160
c; date- 2019-06-27 09:05:10.661
b; date- 2019-06-27 09:05:11.162
c; date- 2019-06-27 09:05:11.669
b; date- 2019-06-27 09:05:12.175
b; date- 2019-06-27 09:05:12.675
b; date- 2019-06-27 09:05:13.176
a; date- 2019-06-27 09:05:13.676
c; date- 2019-06-27 09:05:14.176
b; date- 2019-06-27 09:05:14.677
b; date- 2019-06-27 09:05:15.177
b; date- 2019-06-27 09:05:15.678
c; date- 2019-06-27 09:05:16.178
a; date- 2019-06-27 09:05:16.679
c; date- 2019-06-27 09:05:17.179
c; date- 2019-06-27 09:05:17.680
c; date- 2019-06-27 09:05:18.180
c; date- 2019-06-27 09:05:18.681
c; date- 2019-06-27 09:05:19.181
c; date- 2019-06-27 09:05:19.681
a; date- 2019-06-27 09:05:20.182
c; date- 2019-06-27 09:05:20.682
b; date- 2019-06-27 09:05:21.182
c; date- 2019-06-27 09:05:21.682
b; date- 2019-06-27 09:05:22.183
a; date- 2019-06-27 09:05:22.683
b; date- 2019-06-27 09:05:23.184
a; date- 2019-06-27 09:05:23.684
c; date- 2019-06-27 09:05:24.184
b; date- 2019-06-27 09:05:24.685
b; date- 2019-06-27 09:05:25.186
c; date- 2019-06-27 09:05:25.687
b; date- 2019-06-27 09:05:26.187
a; date- 2019-06-27 09:05:26.687
a; date- 2019-06-27 09:05:27.188
a; date- 2019-06-27 09:05:27.688
b; date- 2019-06-27 09:05:28.188
b; date- 2019-06-27 09:05:28.688
现在我有了一个consumerCEPCharEventConsumer.java,它将读取来自卡夫卡主题charEvent的消息,并过滤以字符“a开头的消息

然后,我编写了以下模式来生成CEP事件/警报,同时我们发现持续的5消息,该消息在5秒内以字符“a”开头

Pattern<String, String> pattern = Pattern.<String> begin("start")
                .times(5).greedy().where(new SimpleCondition<String>() {
                    private static final long serialVersionUID = -6301755149429716724L;

                    @Override
                    public boolean filter(String value) throws Exception {
                        return value.split(";")[0].equals("a");
                    }
                }).within(Time.seconds(5));
打印的警报消息:

4> Found: a; date- 2019-06-27 09:05:26.687
在上述消息中,“发现:a;日期-2019-06-27 09:05:26.687”是警报消息

我不明白弗林克是如何在5秒内计算出连续的5条信息的。我觉得有点不对劲


我正在附上源代码()的附件。任何人都可以按照我的要求进行更正。

基于CEP的应用程序似乎正确地报告了这5条消息

3> a; date- 2019-06-27 09:05:26.687
1> a; date- 2019-06-27 09:05:27.188
1> a; date- 2019-06-27 09:05:27.688
1> a; date- 2019-06-27 09:05:29.198
2> a; date- 2019-06-27 09:05:30.199
在5秒内发生

PatternProcessFunction
中的
processMatch
方法被传递一个
Map match
。在本例中,
match.get(“start”)
返回模式(即整个模式)的“start”子句中的5个匹配事件的列表

因此,要生成一个报告,给出最后一个匹配事件的时间,而不是第一个匹配事件的时间,需要更改

String start = match.get("start").get(0);
out.collect("Found: " + start);


有什么问题吗?我看到从09:05:26.687到09:05:30.199的5个事件,时间不到5秒。David Anderson,我已将收到的消息和警报事件消息分开。09:05:26.687至09:05:30.199之间的消息为接收消息,而非事件消息。如果您在CEPCharEventConsumer.javaI中检查我的代码一次,我会感觉很好。我仍然会在5秒内看到连续5条消息,从09:05:26.687开始。感谢David Anderson的确认,现在我明白了。flink CEP是否可以通过读取上面列表中09:05:26.687中的5条消息,在消息09:05:30.199而不是09:05:26.687上生成事件?如果可能的话,请告诉我怎么做?
String last = match.get("start").get(4);
out.collect("Found: " + last);