【发布时间】:2020-11-17 23:46:24
【问题描述】:
在使用 OkHttp (4.8.0) 对最初配置为永不终止空闲连接的服务器执行一些集成测试时,我看到 OkHttp 连接从未关闭,即使 JVM(测试运行程序)已终止。
虽然我可以在连接池上手动调用evictAll 并且确实会手动关闭套接字,但我希望当JVM 退出时池能够自行正确清理。是否有一些我没有考虑的原因使这些套接字保持打开状态?
【问题讨论】:
在使用 OkHttp (4.8.0) 对最初配置为永不终止空闲连接的服务器执行一些集成测试时,我看到 OkHttp 连接从未关闭,即使 JVM(测试运行程序)已终止。
虽然我可以在连接池上手动调用evictAll 并且确实会手动关闭套接字,但我希望当JVM 退出时池能够自行正确清理。是否有一些我没有考虑的原因使这些套接字保持打开状态?
【问题讨论】:
对于典型的客户端用例,如果您正确地发出和使用请求,OkHttp 不应要求显式关闭。然而,通常 HTTP/2 在共享连接(套接字)上工作,并且这些可以很容易地在 OkHttpClient 实例之间共享,因为您可以在新实例中分叉和修改一些设置。
线程和套接字不应阻止 JVM 终止,一旦进程终止,所有套接字都会关闭。这被认为是“清理”的一种形式。
如你所见,如果你真的想要,你可以强制这样做。
https://square.github.io/okhttp/4.x/okhttp/okhttp3/-ok-http-client/#shutdown-isnt-necessary
您是想要有序关闭以使服务器知道 OkHttp 连接已被释放,还是帮助操作系统释放套接字?
【讨论】: