如何正常关闭使用execute方法

时间:2017-06-28 15:41:17

标签: apache-flink

我正在尝试关闭在我们的junit Integration测试期间启动的StreamExecutionEnvironment。一旦处理了流中的所有项目,我希望能够以确定的方式关闭此执行环境。

现在,当我调用StreamExecutionEnvironment.execute方法时,它永远不会从该调用返回。

1 个答案:

答案 0 :(得分:0)

[可能在这里我来晚了,但是会为那些正在寻找答案或提示的人提供答案]

实际上,您需要做的是从SourceFunction<T>正常退出。 然后整个StreamExecutionEnvironment将被自动关闭。为此,您可能需要一个特殊的结束事件才能发送到源函数中。

写入或扩展(如果使用的是预定义的源函数)以检查特殊的传入事件,该事件将在集成测试结束时发出,并中断循环或取消订阅源。基本模式如下所示。

public class TestSource implements SourceFunction<Event> {

    public void run(SourceContext<T> ctx) throws Exception {
        while (hasContent()) {
            Event event = readNextEvent();

            if (isAnEndEvent(event)) {
              break;
            }

            ctx.collect(event);
        }

    }

}

根据具体情况,在junit测试中,您应该在每个/所有测试用例的末尾发送此特殊事件。

// or @AfterClass
@After   
public void doFinish() {
    // send the special event from a different thread.
}

有时您可能必须从其他线程执行此操作(基本上是在其中生成测试事件的位置)。不像上面。

由于这个问题,建议您为测试使用单独的源函数实现,因此更容易修改以接受特殊的close事件。但是您的实际源函数中的从不预计将投入生产。 :)


javadoc of SourceFunction还介绍了有关stop()函数的信息,您可以从其中看到如何实现TwitterSource的示例。

  

正常停止功能
  函数可以另外实现{@link   org.apache.flink.api.common.functions.StoppableFunction}接口。   与“取消”相比,“停止”功能意味着优美   退出,使状态和发出的元素保持一致   状态