0

我有一个正在调用 Swift 集群的 web 服务,发现到它的连接处于 CLOSE_WAIT 状态并且直到 HA 代理强制关闭连接并记录事件才被关闭,导致大量事件生成。

调查这个我发现这是由于我们完成连接后没有断开与底层 HttpURLConnection 的连接。

因此,我已经对我们的大多数 RESTful 服务进行了必要的更改,但我不确定在我们直接从 Web 服务返回从 Swift 检索的 InputStream 的情况下,我应该如何断开与 HttpURLConnection 的连接。

对于在这种情况下应该做什么我不知道或者任何人都可以想到在流被消耗后断开连接的任何好主意,是否有某种最佳实践?

谢谢。

4

2 回答 2

0

你不应该这样做。底层的连接池HttpURLConnection应该在少量几秒(我相信是 15 秒)空闲时间后关闭底层 TCP 连接。通过调用disconnect(),您将完全禁用连接池,这会浪费更多的网络和服务器资源,因为每次调用都需要一个新连接。

于 2013-03-12T05:10:02.480 回答
0

我最终只是将 InputStream 包装在一个存储 HttpURLConnection 的对象中,并在完成读取流后调用 disconnect 方法

public class WrappedInputStream extends InputStream{

        InputStream is;
        HttpURLConnection urlconn;

        public WarppedInputStream(InputStream is, HttpURLConnection urlconn){
            this.is = is;
            this.urlconn = urlconn;
        }

        @Override
        public int read() throws IOException{
            int read = this.is.read();
            if (read != -1){
                return read;
            }else{
                is.close();
                urlconn.disconnect();
                return -1;
            }
        }

        @Override
        public int read(byte[] b) throws IOException{
            int read = this.is.read(b);
            if (read != -1){
                return read;
            }else{
                is.close();
                urlconn.disconnect();
                return -1;
            }
        }

        @Override
        public int read(byte[] b, int off, int len) throws IOException{
            int read = this.is.read(b, off, len);
            if (read != -1){
                return read;
            }else{
                is.close();
                urlconn.disconnect();
                return -1;
            }
        }
    }
于 2013-03-12T03:51:48.183 回答