什么是SourceFunction#run应该在Flink中工作?

时间:2018-07-18 12:30:25

标签: apache-flink

我为Flink不支持的Message Queue扩展了RichSourceFunction,从而实现了Source。

当我实现运行方法时,其签名为:

  override def run(sc: SourceFunction.SourceContext[String]): Unit = {

    val msg = read_from_mq
    sc.collect(msg)
  }

调用run方法时,如果消息队列中没有更新的消息,则

  1. 我应该在不调用sc.collect

  2. 的情况下运行
  3. 我可以等到有新数据出现(在这种情况下,run方法将被阻止)。

我希望使用第二种,不确定是否正确使用。

2 个答案:

答案 0 :(得分:1)

您可能知道这两个选项在功能上都是正确的,并且会产生正确的结果。

据说第二个是首选,因为您没有握住线程。实际上,如果您查看RabbitMQ连接器的实现,您会注意到它的实现方式:在其run内部,它间接地等待将消息放置在BlockingQueue上。

答案 1 :(得分:1)

Flink源的run方法应该循环,不断产生输出,直到调用其cancel方法为止。当什么都没有产生时,最好是找到一种阻塞等待的方法。

apache nifi source connector是用作模型的另一个合理示例。您会注意到,它无事可做时会休眠一段可配置的时间。