我们在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客户端的不同代码?
答案 0 :(得分:1)
取决于,通常你会保持你的httpclient,直到你关闭服务器。由于您使用的是弹簧靴,只需将其作为弹簧豆注入即可。这也是一个很好的机会来配置超时,其中一些默认为危险值(如0,这意味着无限),并将它们与您拥有的任何负载平衡器超时对齐。
在这种情况下,关闭你的httpclient真的很重要,因为它有的资源将在应用程序退出时释放。
但是如果你是在需要基础上创建它的(为什么?)你可能想关闭它。根据您的设置方式,它可能正在运行一些执行程序,有一个连接池等。不清理它然后重复创建更多的httpclients,可能会导致文件句柄用完。
有这种错误的事情是,只有在用完文件句柄后才会知道你有问题,这取决于你的服务器流量可能需要很长时间。由于未发布的文件句柄,我处理的服务器崩溃,发生时难以调试。简而言之,如果它有一个close方法并且可以实现可关闭,那么你最好有充分的理由不在finally块或使用资源的try中调用它。