0

Swiftクラスターを呼び出しているWebサービスがあり、そのWebサービスへの接続がCLOSE_WAIT状態にあり、HAプロキシが接続を強制的に閉じてイベントをログに記録するまで閉じられないことがわかりました。これにより、多数のイベントが発生します。生成されます。

これを調べてみると、接続が終了した後、基になるHttpURLConnectionから切断されなかったことが原因であることがわかりました。

そのため、RESTfulサービスの大部分に必要な変更を加えましたが、Swiftから取得したInputStreamをWebサービスから直接返す場合にHttpURLConnectionから切断する方法がわかりません。

この場合に何をすべきかについて、私が気付いていない、またはストリームが消費された後に切断するための良いアイデアを誰かが考えることができる、ある種のベストプラクティスはありますか?

ありがとう。

4

2 に答える 2

0

HttpURLConnectionも格納するオブジェクトでInputStreamをラップし、ストリームの読み取りが終了したら、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 に答える
0

これを行う必要はありません。基盤となる接続プールHttpURLConnectionは、アイドル時間の数秒(15秒)後に基盤となるTCP接続を閉じる必要があります。呼び出しdisconnect()を行うと、接続プールが完全に無効になり、呼び出しごとに新しい接続が必要になるため、ネットワークとサーバーのリソースが無駄になります。

于 2013-03-12T05:10:02.480 に答える