【问题标题】:Apache Flink: How to implement a SourceFunction?Apache Flink:如何实现 SourceFunction?
【发布时间】:2025-12-24 06:25:07
【问题描述】:

我已经实现了一个SourceFunction,它从一个 URL 中获取数据(一个字符串)。然后我正在处理该数据的keyBy() 并应用 10 分钟的窗口。现在SourceFunction 只被调用一次,windows 对数据运行 10 分钟。如何从SourceFunction 连续获取数据?

DataStream<String> = env.addSource(MySource())   // This runs only once
                        .keyBy(some keyby function)
                        .window(for 10 minutes)  // This runs for 10 minutes for the data obtained once by Source function
                        .process(some process function)

我想在一定的时间间隔内重复运行SourceFunction,让窗口处理不断获取的数据。

【问题讨论】:

    标签: java streaming apache-flink flink-streaming


    【解决方案1】:

    您的SourceFunctions run() 方法应该是一个循环,它执行睡眠(或任何其他调度机制)来完成工作。

    一种常见的模式是使用某种原子布尔值,您在首次调用 run 时设置为 true,并在调用 cancel 时设置为 false。

    所以你的 run 方法中有这样的东西:

    while (running) {
       // fetch some data, can be async
       ctx.collect(data);
       Thread.sleep(period);
    }
    

    您可以按照您认为合适的方式执行该部分,但重要的是,在您实际完成或被取消之前,您不要退出 SourceFunctionrun 方法。

    【讨论】: