2016-12-22 3 views
0

私はApache CommonのHTTPClientを使ってHTTP接続を行っています。 接続タイプはPOSTで、クライアントは接続からの出力を読み取ります。 しかし、接続の状態に関係なく、いつでも接続を中断できる必要があります。これを行う最善の方法は何ですか? タイムアウトが組み込まれていますか?よろしくです。 よろしくお願いします。Apache HTTPClientいつでもタイムアウトします

EDIT: 私の質問を明確にするには:
接続を切断するタイミングをユーザーが選択できるようにしたいと思います。つまり、パラメータのcURLに似た機能で
: CURLOPT_TIMEOUTあなたがHttpClientBuilderを使ってHttpClientをのインスタンスをインスタンス化している https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html

答えて

0

は、あなたはこれにより、次に2つのパラメータを受け入れビルダーにRequestConfigのインスタンスを渡すことができます。

SocketTimeout - ソケット待機時間(SO_TIMEOUT)をミリ秒で定義します。これは、データの待機のタイムアウト、つまり、連続する2つのデータパケット間の最大休止時間です。

ConnectTimeout - 接続が確立されるまでのタイムアウトをミリ秒単位で指定します。タイムアウト値0は、無限タイムアウトとして解釈されます。

ConnectionRequestTimeout - 接続マネージャーから接続を要求するときに使用されるタイムアウトをミリ秒単位で返します。タイムアウト値0は、無限タイムアウトとして解釈されます。

あなたが探しているのはです。SocketTimeoutです。

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT) 
       .setConnectionRequestTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build(); 
httpClient = HttpClientBuilder.create().disableAutomaticRetries().setDefaultRequestConfig(requestConfig) 
       .setConnectionManager(poolingHttpClientConnectionManager).disableRedirectHandling().build(); 

ConnectionKeepAliveStrategyをご覧ください。 「2.6接続の維持戦略」のセクションを参照してくださいpage

+0

こんにちは、お返事ありがとうございます。申し訳ありませんが、私は自分自身を十分に明確にしていませんでした。 ソケットタイムアウトを使用してソリューションを試しましたが、接続を停止しません。 基本的には、その接続を通じて一定のデータストリームを受信しますが、ユーザーが指定した時間(10秒など)後に切断できるようにしたいと考えています。 – GreenApples53

+0

@ GreenApples53さて、私は疑問を誤解しました。 ConnectionKeepAliveStratergyが役立つかどうか確認できますか?最初の応答がサーバーから受信された後、キープアライブタイムアウトを使用してこれを処理できます。応答が受信される前に、これを達成するためにソケットタイムアウトを使用することができます。だから私はあなたの両方を混在させる必要があると思います –

+0

私は現在、指定された時間後に単に接続を打ち切るタイマースレッドを生成するソリューションを実装しました。私はこれがベストプラクティスかどうかは分かりませんが、それは私にとってはうまくいくようです。これに何か問題があると思いますか?敬具 – GreenApples53

0

DefaultHttpClientを使用している場合は、HttpParamsを使用して接続関連の設定を行うことができます。

SO_TIMEOUTはSocketTimeoutです - ソケットタイムアウト(SO_TIMEOUT)をミリ秒単位で定義します。これはデータの待機のタイムアウトであり、言い換えれば2つの連続するデータパケット間の最大休止時間です。

HttpParams httpParams = new BasicHttpParams(); 
httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT); 
httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT); 
DefaultHttpClient backend = new DefaultHttpClient(httpParams); 

それを行うための良い方法は@Bandiキショールが提案されているようHttpClientBuilderを使用することです。またはこれらの設定をセッターを使用して直接受け入れるPoolingClientConnectionManagerを使用してください。

関連する問題