我正在尝试关闭在我们的junit Integration测试期间启动的StreamExecutionEnvironment。一旦处理了流中的所有项目,我希望能够以确定的方式关闭此执行环境。
现在,当我调用StreamExecutionEnvironment.execute方法时,它永远不会从该调用返回。
答案 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}接口。 与“取消”相比,“停止”功能意味着优美 退出,使状态和发出的元素保持一致 状态
。