我为Flink不支持的Message Queue扩展了RichSourceFunction
,从而实现了Source。
当我实现运行方法时,其签名为:
override def run(sc: SourceFunction.SourceContext[String]): Unit = {
val msg = read_from_mq
sc.collect(msg)
}
调用run
方法时,如果消息队列中没有更新的消息,则
我应该在不调用sc.collect
或
我可以等到有新数据出现(在这种情况下,run
方法将被阻止)。
我希望使用第二种,不确定是否正确使用。
答案 0 :(得分:1)
您可能知道这两个选项在功能上都是正确的,并且会产生正确的结果。
据说第二个是首选,因为您没有握住线程。实际上,如果您查看RabbitMQ连接器的实现,您会注意到它的实现方式:在其run
内部,它间接地等待将消息放置在BlockingQueue
上。>
答案 1 :(得分:1)
Flink源的run方法应该循环,不断产生输出,直到调用其cancel方法为止。当什么都没有产生时,最好是找到一种阻塞等待的方法。
apache nifi source connector是用作模型的另一个合理示例。您会注意到,它无事可做时会休眠一段可配置的时间。