未关闭的httpclient有什么影响吗?
Does unclosed httpclient have any effect?
我们在 Apache tomcat 8 上部署 java spring 启动应用程序,我们尝试编写适当的 java 代码。
但是我们有一个旧的、低流量且不可维护的代码,它有未关闭的 CloseableHttpClient
和 CloseableHttpResponse
CloseableHttpClient httpClient = HttpClients.custom().build();
try {
CloseableHttpResponse response = httpClient.execute(target, post);
...(no finally clause)
根据 apache 当然两者都应该关闭,尽管在 quickstart 演示中 httpclient 没有关闭:
CloseableHttpClient
CloseableHttpClient httpclient = HttpClients.createDefault();
...
代码正在投入生产,没有任何已知问题。
我能知道不关闭此类资源的真正影响,以便了解修复的重要性吗?
以下一项或多项可能 handle/close 那些 http(使用代码或配置):
Tomcat/spring 启动或以正确方式使用 http 客户端的不同代码?
视情况而定,通常您会保留 httpclient,直到您关闭服务器。由于您正在使用 spring 引导,只需将其作为 spring bean 注入即可。这也是配置超时之类的好机会,其中一些默认为危险值(如 0,这意味着无限)并将它们与您拥有的任何 load-balancer 超时对齐。
在这种情况下,关闭您的 httpclient 并不重要,因为它拥有的任何资源都将在应用程序退出时释放。
但是如果您是根据需要创建它(为什么?),您可能想要关闭它。根据您的设置方式,它可能 运行 一些执行程序,有一个连接池等。不清理它然后重复创建更多 httpclients,可能会导致您 运行文件句柄。
这种 bug 的问题在于,只有在 运行 文件句柄用完之后,您才会知道自己遇到了问题,这取决于您的服务器流量,这可能需要相当长的一段时间。我处理过由于未发布的文件句柄而导致服务器崩溃的问题,当它发生时很难调试。简而言之,如果它有一个 close 方法并实现了 closable,你最好有充分的理由不要在 finally 块或尝试使用资源时调用它。
我们在 Apache tomcat 8 上部署 java spring 启动应用程序,我们尝试编写适当的 java 代码。
但是我们有一个旧的、低流量且不可维护的代码,它有未关闭的 CloseableHttpClient
和 CloseableHttpResponse
CloseableHttpClient httpClient = HttpClients.custom().build();
try {
CloseableHttpResponse response = httpClient.execute(target, post);
...(no finally clause)
根据 apache 当然两者都应该关闭,尽管在 quickstart 演示中 httpclient 没有关闭:
CloseableHttpClient
CloseableHttpClient httpclient = HttpClients.createDefault();
...
代码正在投入生产,没有任何已知问题。
我能知道不关闭此类资源的真正影响,以便了解修复的重要性吗?
以下一项或多项可能 handle/close 那些 http(使用代码或配置):
Tomcat/spring 启动或以正确方式使用 http 客户端的不同代码?
视情况而定,通常您会保留 httpclient,直到您关闭服务器。由于您正在使用 spring 引导,只需将其作为 spring bean 注入即可。这也是配置超时之类的好机会,其中一些默认为危险值(如 0,这意味着无限)并将它们与您拥有的任何 load-balancer 超时对齐。
在这种情况下,关闭您的 httpclient 并不重要,因为它拥有的任何资源都将在应用程序退出时释放。
但是如果您是根据需要创建它(为什么?),您可能想要关闭它。根据您的设置方式,它可能 运行 一些执行程序,有一个连接池等。不清理它然后重复创建更多 httpclients,可能会导致您 运行文件句柄。
这种 bug 的问题在于,只有在 运行 文件句柄用完之后,您才会知道自己遇到了问题,这取决于您的服务器流量,这可能需要相当长的一段时间。我处理过由于未发布的文件句柄而导致服务器崩溃的问题,当它发生时很难调试。简而言之,如果它有一个 close 方法并实现了 closable,你最好有充分的理由不要在 finally 块或尝试使用资源时调用它。