다중 스레드 요청 오류를 테스트하기 위해 apache-httpclient의 httpclient에 대한 테스트 샘플을 작성하고 있습니다.HttpClient 4.5.x 다중 스레드 요청 오류 :이 풀에서 임대되지 않았습니다.
for 루프에서 실행하고 각 루프에 2 개의 스레드를 생성하여 2 개의 다른 호스트 설정을 풀링 관리자로 설정하여 테스트 케이스를 실행하십시오.
10 개의 루프에서 항상 다음과 같은 오류가 발생했습니다. 스레드 "Thread-2"의 예외 java.lang.IllegalStateException : Entry [ID : 17] [경로 : {} -> http : // *** : 8000] [상태 : null]이 풀에서 임대되지 않았습니다. org.apache.http.util.Asserts.check (Asserts.java:46)
내 코드에 어떤 문제가 있습니까? 어떻게해야합니까?
샘플은 다음과 같습니다 :이에서 프록시 HttpClient를 설정하기 때문에
private void testHttpClient() {
HttpHost proxy = new HttpHost("dev.host.com", 8001);
final DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(20);
cm.setDefaultMaxPerRoute(1);
HttpHost localhost1 = new HttpHost("dev.test1.com", 8001);
cm.setMaxPerRoute(new HttpRoute(localhost1), 2);
HttpHost localhost2 = new HttpHost("dev.test2.com", 8000);
cm.setMaxPerRoute(new HttpRoute(localhost2), 2);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(1000)
.setSocketTimeout(1000)
.setConnectionRequestTimeout(1000)
.build();
final CloseableHttpClient httpclient1 = HttpClients.custom()
.setConnectionManager(cm)
.setRoutePlanner(routePlanner)
.setDefaultRequestConfig(requestConfig)
.build();
RequestConfig requestConfig2 = RequestConfig.custom()
.setConnectTimeout(1000)
.setSocketTimeout(1000)
.setConnectionRequestTimeout(1000)
.build();
final CloseableHttpClient httpclient2 = HttpClients.custom()
.setConnectionManager(cm)
.setRoutePlanner(routePlanner)
.setDefaultRequestConfig(requestConfig2)
.build();
class HttpClientThead1 implements Runnable {
public void run() {
for (int i = 1; i <= 1; i++) {
System.out.println("HttpClientThead1 Start");
HttpClientContext context = HttpClientContext.create();
try {
HttpGet httpget = new HttpGet("http://dev.test1.com:8001/test/id/10001");
CloseableHttpResponse response = httpclient1.execute(httpget, context);
long t = System.currentTimeMillis();
System.out.println("HttpClientThead1 " + i + ":" + response.getEntity().toString() + " " + t);
response.close();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
cm.closeExpiredConnections();
cm.closeIdleConnections(30, TimeUnit.SECONDS);
}
}
}
}
class HttpClientThead2 implements Runnable {
public void run() {
for (int i = 1; i <= 1; i++) {
System.out.println("HttpClientThead2 Start");
HttpClientContext context = HttpClientContext.create();
try {
HttpGet httpget2 = new HttpGet("http://dev.test2.com:8000/test/id/10002");
CloseableHttpResponse response2 = httpclient2.execute(httpget2, context);
long t = System.currentTimeMillis();
System.out.println("HttpClientThead2 " + i + ":" + response2.getEntity().toString() + " " + t);
response2.close();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
cm.closeExpiredConnections();
cm.closeIdleConnections(30, TimeUnit.SECONDS);
}
}
}
}
for (int j = 1; j <= 10; j++) {
HttpClientThead1 t1 = new HttpClientThead1();
HttpClientThead2 t2 = new HttpClientThead2();
Thread thread1 = new Thread(t1);
Thread thread2 = new Thread(t2);
thread1.start();
thread2.start();
}
}
확인해 보았습니다. cm.setDefaultMaxPerRoute (10)를 변경하면 호스트 설정이 작동하지 않는 것으로 보입니다. 그런 다음에 알았습니다. 왜? –