Tcp 当重新启动flink作业/作业进行故障切换时,您应该如何优雅地释放所有资源?

Tcp 当重新启动flink作业/作业进行故障切换时,您应该如何优雅地释放所有资源?,tcp,apache-flink,flink-streaming,Tcp,Apache Flink,Flink Streaming,我们有一个flink作业,它保存一些IO资源,如tcp连接等。我们总是用finally块围绕连接函数来关闭连接,并在所有操作符的close()方法中释放连接。但是我们发现,当故障转移不时发生时,连接没有被释放,因为我们在服务器端发现了很多关闭等待状态。我们猜测flink可能会使用某种中断方法来重新启动作业,这样代码就不会进入finally块。当flink执行故障切换时,释放资源的正确方法是什么?为了能够访问功能的flink生命周期,您应该在用户定义的功能中实现您的逻辑,实现RichFunctio

我们有一个flink作业,它保存一些IO资源,如tcp连接等。我们总是用finally块围绕连接函数来关闭连接,并在所有操作符的close()方法中释放连接。但是我们发现,当故障转移不时发生时,连接没有被释放,因为我们在服务器端发现了很多关闭等待状态。我们猜测flink可能会使用某种中断方法来重新启动作业,这样代码就不会进入finally块。当flink执行故障切换时,释放资源的正确方法是什么?

为了能够访问功能的flink生命周期,您应该在用户定义的功能中实现您的逻辑,实现
RichFunction
界面。此类定义函数生命周期的方法,以及访问执行函数的上下文的方法

除此之外,此接口公开了用于清理工作的
close()
方法:


/**
*用户代码的分解方法。它是在最后一次调用主要工作方法之后调用的
*(例如映射或连接)。对于作为迭代一部分的函数,此方法将
*在每次迭代超步后调用。
*
*此方法可用于清理工作。
*
*@throws异常实现可以转发运行时捕获的异常。当
*运行时捕获异常,它中止任务并允许故障转移逻辑
*决定是否重试任务执行。
*/
void close()抛出异常;

因此,我相信
close()
函数是优雅地释放资源的合适位置。

我们实际上在所有close()方法中实现了这些释放逻辑。但实际上,当作业重新启动时,无论出于何种原因,连接都没有关闭。正如我前面提到的,我们猜测flink可能会使用一些中断方法来重新启动作业,这样代码就不会转到finally block或close()方法