web-dev-qa-db-ja.com

HttpClientError:ターゲットサーバーが応答に失敗しました

個々のホストの最大接続数を設定するPoolingClientConnectionManagerを使用してhttpクライアントを使用してサーバーにアクセスしようとしています

 //Code that inilizes my connection mananger and http client 

HttpParams httpParam = httpclient.getParams(); HttpConnectionParams.setSoTimeout(httpParam、SOCKET_TIMEOUT);

    HttpConnectionParams.setConnectionTimeout(httpParam, CONN_TIMEOUT);

    httpclient.setParams(httpParam);

    //Run a thread which closes Expired connections
    new ConnectionManager(connManager).start(); 

        //Code that executes my request 
    HttpPost httpPost = new HttpPost(url);
            HttpEntity httpEntity = new StringEntity(request, "UTF-8");
    httpPost.setEntity(httpEntity);

    Header acceptEncoding = new BasicHeader("Accept-Encoding", "gzip,deflate");
    httpPost.setHeader(acceptEncoding);     

    if(contenttype != null && !contenttype.equals("")){
        Header contentType = new BasicHeader("Content-Type", contenttype);
        httpPost.setHeader(contentType);
    }
            InputStream inputStream = null;
    LOG.info(dataSource + URL + url + REQUEST + request);

    HttpResponse response = httpclient.execute(httpPost);

つまり、HTTP永続性に接続プーリングを使用しています。

このエラーは散発的に発生しています。

The target server failed to respond
org.Apache.http.NoHttpResponseException: The target server failed to respond
        at org.Apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.Java:95)
        at org.Apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.Java:62)
        at org.Apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.Java:254)
        at org.Apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.Java:289)
        at org.Apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.Java:252)
        at org.Apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.Java:191)
        at org.Apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.Java:300)
        at org.Apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.Java:127)
        at org.Apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.Java:517)
        at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:906)

誰もこれを解決する方法を知っていますか?

アイドル状態の接続もシャットダウンしています。

いくつか助けてください。

http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

13
Balaji V

おそらく、それはHttpClientのバグです。

HttpClient 4.4を使用している場合は、4.4.1にアップグレードしてください。

詳細については、 このリンク をご覧ください。

アップグレードできない場合は、次のリンクが役立つ場合があります。

http://www.nuxeo.com/blog/using-httpclient-properly-avoid-closewait-tcp-connections/

幸運を!

14
daimarom

最近HttpClient 5を使用しているときに同様の問題に直面しました。

HttpClientログを有効にして、問題の原因が古い接続であることがわかりました。

以下を追加すると、問題の解決に役立ち、再利用前にプール内で非アクティブに保たれている間に古くなった接続を検出および検証します。

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();

connectionManager.setValidateAfterInactivity(timeinmilliseconds);
4
RSingh