一开始的代码:
这段代码在前端发送请求执行时,前端一致在打转转,但是Response为null,一开始不知道什么原因,后来查看后台日志,日志的内容如下:
查看源码发现:
源码中的第一个try catch finally代码块有问题。不管 try是否跑出异常,finally一定会执行的,执行了这个releaseconnection(),这个方法链接释放,释放链接后服务端主动关闭了这个链接。所以,执行到"获取响应体Json字符串处"时,想去获取响应体时,服务器已关闭了连接,导致socket close。
解决方法:
将两个try catch finally块的代码合并在一个try catch finally中。
releaseconnection()方法,是释放该链接之后并不关闭,连接池管理器就会关闭这个链接重复让别的请求使用。这样这个链接就可以重复使用了。官方的文档中表达如下:
- This is a crucial step to keep things flowing. We must tell HttpClient that we are done with the connection and that it can now be reused. Without doing this HttpClient will wait indefinitely for a connection to free up so that it can be reused.
翻译过来的意思大概是,这个是资源流动利用的关键。必须告诉httpclient,这个链接释放掉可以被重复使用。使用这个方法的好处就是,不需要等待有一个空闲的httpclient才能执行下一个链接。