0

から派生しDefaultHttpClientて使用するクラスを作成しましたConnectionKeepAliveStrategy。ここで、実行時に接続を再利用したのか、新しい接続を作成したのかを知りたいですClientConnectionManager(たとえば、サーバーとの接続がタイムアウトしたため)。

どうすればわかりますか?

public class MyHttpClient extends DefaultHttpClient
{
    // some code setting constants

        public MyHttpClient()
        {
            super();

            // some code setting http connection params


            setKeepAliveStrategy(new ConnectionKeepAliveStrategy()
            {
                @Override
                public long getKeepAliveDuration(final HttpResponse response, final HttpContext context)
                {
                    return KEEP_ALIVE_TIMEOUT * MS_PER_SECOND;
                }
            });

        }

    @Override
    protected ClientConnectionManager createClientConnectionManager()
    {

        // some code registering HTTP and HTTPS 

        return new ThreadSafeClientConnManager(getParams(), registry);
    }       

    // some code for the socketfactory
}

// At some other class:

public class SomeClass
{
   private static final HttpClient HTTP_CLIENT = new MyHttpClient();

   public void someMethod()
   {
    /* some code */

    HttpGet get = new HttpGet(some url);
    HttpResponse getResponse = HTTP_CLIENT.execute(get);

    /* more code */
   }
}

電話をかけるとHTTP_CLIENT.execute()、新しい接続が作成されたのClientConnectionManagerか、既存の接続が再利用されたのかを確認できますか?

4

1 に答える 1

0

OK、インターネットを検索し、https 接続を使用して大量のデータを取得するのにかかる時間を測定することで、それを理解しました。

  1. キープアライブ戦略を定義するかどうかに関係なく、 clientConnectionManager はデフォルトで接続を再利用しようとします。setKeepAlive 戦略を使用すると、いじくり回すことができますが、データを取得するのにかかった時間に大きな違いは見つかりませんでした。

  2. setReuseStrategy を使用すると、データフェッチごとに新しい接続が確実に作成されるようになり、多くのデータを取得する時間が 2 倍になることがよくありました。これは、https 接続をセットアップするためのオーバーヘッドが原因です。

于 2012-08-16T06:16:33.267 に答える