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

Apache flink 什么是SourceFunction#run应该在Flink中工作?,apache-flink,Apache Flink,我通过扩展Flink不支持的消息队列的RichSourceFunction实现了一个源代码 当我实现签名为的run方法时: override def run(sc: SourceFunction.SourceContext[String]): Unit = { val msg = read_from_mq sc.collect(msg) } 调用run方法时,如果消息队列中没有更新的消息 我应该在不调用sc.collect的情况下运行吗 我可以等到更新的数据到来(在这

我通过扩展Flink不支持的消息队列的
RichSourceFunction
实现了一个源代码

当我实现签名为的run方法时:

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

    val msg = read_from_mq
    sc.collect(msg)
  }
调用
run
方法时,如果消息队列中没有更新的消息

  • 我应该在不调用sc.collect的情况下运行吗

  • 我可以等到更新的数据到来(在这种情况下,
    run
    方法将被阻止)


  • 我更喜欢第二个,不确定这是否是正确的用法。

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


    这是说,第二个是首选的,因为你没有举行线程。事实上,如果您查看RabbitMQ连接器实现,您会注意到它的实现方式是这样的:在其
    运行中
    它会间接地等待消息被放置到
    阻塞队列

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


    这是说,第二个是首选的,因为你没有举行线程。事实上,如果您查看RabbitMQ连接器实现,您会注意到它的实现方式是这样的:在它的
    运行
    内部,它间接地等待消息被放置在
    阻塞队列
    上,Flink源的run方法应该循环,无休止地生成输出,直到调用它的cancel方法为止。当没有什么可生产时,最好能找到一种方法进行阻塞等待


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

    Flink源的run方法应该循环,无休止地生成输出,直到调用其cancel方法为止。当没有什么可生产时,最好能找到一种方法进行阻塞等待

    这是另一个用作模型的合理示例。您会注意到,当它无事可做时,它会在一个可配置的时间间隔内休眠