我们在 Apache tomcat 8 上部署 java spring boot 应用程序,并尝试编写正确的 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();
...
代码正在生产中,没有任何已知问题。
我可以知道不关闭此类资源的真正影响,以便了解修复它的重要性吗?
以下一项或多项是否可以处理/关闭这些 http(使用代码或配置):
Tomcat/spring boot 或以正确方式使用 http 客户端的其他代码?
最佳答案
视情况而定,通常您会保留 httpclient,直到关闭服务器。由于您使用的是 spring boot,因此只需将其作为 spring bean 注入(inject)即可。这也是配置超时等内容的好机会,其中一些默认为危险值(例如 0,这意味着无限)并将其与您拥有的任何负载均衡器超时保持一致。
在这种情况下,关闭 httpclient 并不重要,因为它拥有的任何资源都将在应用程序退出时释放。
但是,如果您根据需要创建它(为什么?),您可能想关闭它。根据您的设置方式,它可能正在运行一些执行程序,有一个连接池等。如果不清理它,然后重复创建更多的 httpclient,可能会导致您用完文件句柄。
这种错误的问题是,只有在文件句柄用完之后,您才会知道有问题,这取决于您的服务器流量,这可能需要相当长的时间。我处理过由于未发布的文件句柄而导致服务器崩溃的情况,发生这种情况时很难进行调试。简而言之,如果它有一个 close 方法并实现了 closeable,那么您最好有充分的理由不在 finally block 或资源尝试中调用它。
关于java - 未关闭httpclient有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49430790/