私はApachehttpクライアントを使用してWSをテストしています。私はジャージでgetWSを書いています。このWSのURLは
http://localhost:8080/mobilestore/rest/sysgestockmobilews/getinventory?xml=dataString
uRLを使用してこのWSを呼び出すには、次のようなメソッドを記述します。
public static void getInventory(String input)
throws ClientProtocolException, IOException {
System.out.println(input);
String url = URL + "getinventory";
HttpClient client = new DefaultHttpClient();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("xml", input));
String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");
url += "?" + paramString;
System.out.println(url);
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader(new InputStreamReader(response
.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
}
プログラムを実行してこの関数にURLを渡すと、次の行で例外が発生します
HttpResponse response = client.execute(request);
例外は次のとおりです
Aug 14, 2013 9:31:50 PM org.Apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: I/O exception (org.Apache.http.NoHttpResponseException) caught when processing request: The target server failed to respond
Aug 14, 2013 9:31:50 PM org.Apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: Retrying request
Aug 14, 2013 9:31:50 PM org.Apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: I/O exception (org.Apache.http.NoHttpResponseException) caught when processing request: The target server failed to respond
Aug 14, 2013 9:31:50 PM org.Apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: Retrying request
Aug 14, 2013 9:31:50 PM org.Apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: I/O exception (org.Apache.http.NoHttpResponseException) caught when processing request: The target server failed to respond
Aug 14, 2013 9:31:50 PM org.Apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: Retrying request
Exception in thread "main" 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.tryExecute(DefaultRequestDirector.Java:715)
at org.Apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.Java:520)
at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:906)
at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:805)
at org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:784)
at com.tainosystems.http.client.TestWs.getInventory(TestWs.Java:66)
at com.tainosystems.http.client.TestWs.main(TestWs.Java:47)
ここで、WS URLを使用し、任意のブラウザーを使用してヒットすると、期待どおりの結果が得られますが、Apachehttpクライアントコードの何が問題になっているのかを知りたいです。
ここからリンクをたどって、この答えにたどり着きました: 負荷テストのためにNoHttpResponseExceptionを取得
それは私を正しい軌道に乗せました。答えを少し更新するために、現在のhttp-client 4.5APIを使用したソリューションを次に示します。
private final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(createHttpClient());
private CloseableHttpClient createHttpClient() {
return HttpClients.custom().setRetryHandler((exception, executionCount, context) -> {
if (executionCount > 3) {
LOGGER.warn("Maximum tries reached for client http pool ");
return false;
}
if (exception instanceof org.Apache.http.NoHttpResponseException) {
LOGGER.warn("No response from server on " + executionCount + " call");
return true;
}
return false;
}).build();
}
そこではspring-webも使用しているので、RestTemplateで使用したいので、RestTemplateファクトリのパラメーターとしてクライアントを使用しました。