关于Flink1.14 FlinkCEP为什么打印不出数据的原因(附可用代码)

打印不出数据的原因

  1. 默认的事件触发时间是事件时间
  2. 官网没有说明如何设置处理时间

如何打印出数据

  1. 按照官网提示的,无key的流设置并行度为1
  2. 设置事件触发的时间为处理事件,代码如下:
PatternStream<String> patternStream = CEP
              .pattern(input, pattern)
              .inProcessingTime();

完整测试代码

import org.apache.flink.cep.CEP;
import org.apache.flink.cep.PatternStream;
import org.apache.flink.cep.functions.PatternProcessFunction;
import org.apache.flink.cep.pattern.Pattern;
import org.apache.flink.cep.pattern.conditions.SimpleCondition;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import org.apache.flink.util.Collector;

import java.util.List;
import java.util.Map;

/**
 *
 *
 * 复杂事件处理定义: 在信息流中识别用户定义的有意义的事件。
 *
 * Flink中的事件: 每一条数据是一个事件
 *
 * 复杂事件: 基于时间流的多个关联事件组合在一起,产生的新事件。
 *
 * 复杂事件处理过程: 多个事件发生的时间/之间的关联/内在的属性状态   ->  处理 推断 动作
 *
 * 规则: 定义复杂事件如何产生。
 *
 *
 */
public class StreamingJob {

    public static void main(String[] args) throws Exception {
        // set up the streaming execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<String> input = env.addSource(new RichSourceFunction<String>() {
            boolean isClose = false;

            @Override
            public void run(SourceContext<String> sourceContext) throws Exception {
                while (!isClose) {
//					System.out.println("send data ");
                    sourceContext.collect("abcd");
                    sourceContext.collect("dec");
                    sourceContext.collect("ded");
                    sourceContext.collect("abc");

                    Thread.sleep(1000);
                }
            }

            @Override
            public void cancel() {
                System.out.println("close source");
                isClose = true;
            }
        }).setParallelism(1);

        // 当第一个事件是以a开头的时候,第二个事件必须以c为结尾,复杂事件的结束以第n个事件等于abc而触发处理
        Pattern<String, ?> pattern = Pattern.<String>begin("start").where(
                new SimpleCondition<String>() {
                    @Override
                    public boolean filter(String event) {
                        return event.startsWith("a");
                    }
                }
        ).next("middle").where(
                new SimpleCondition<String>() {
                    @Override
                    public boolean filter(String subEvent) {
                        return subEvent.endsWith("c");
                    }
                }
        ).followedBy("end").where(
                new SimpleCondition<String>() {
                    @Override
                    public boolean filter(String event) {
                        return event.equals("abc");
                    }
                }
        );


        PatternStream<String> patternStream = CEP.pattern(input, pattern)
                .inProcessingTime();


        DataStream<String> result = patternStream.process(
                new PatternProcessFunction<String, String>() {
                    @Override
                    public void processMatch(
                            Map<String, List<String>> pattern,
                            Context ctx,
                            Collector<String> out) throws Exception {
                        List<String> start = pattern.get("start");
                        List<String> middle = pattern.get("middle");
                        List<String> end = pattern.get("end");

                        System.out.println("start:" + start);
                        System.out.println("middle:" + middle);
                        System.out.println("end:" + end);

                        out.collect("ccccc");
                    }
                }).setParallelism(1);

        result.print();

        // execute program
        env.execute("Flink Streaming CEP Test ");
    }
}

关注以下微信公众号,了解更多关于复杂事件处理的知识。

在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值