Apache Flink:如何实现SourceFunction?

时间:2018-04-05 14:11:37

标签: java streaming apache-flink flink-streaming

我已经实现了一个从URL中获取数据(String)的SourceFunction。然后我正在对这些数据进行keyBy()并应用一个10分钟的窗口。现在SourceFunction只被调用一次,窗口对数据进行操作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,让窗口处理连续获取的数据。

1 个答案:

答案 0 :(得分:3)

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

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

所以你在run方法中有类似的东西:

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

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