Java HTTP 클라이언트 요청(타임아웃이 정의됨)
클라우드 내 여러 서버에 BIT(Built-in Tests)를 만들고 싶습니다.대규모 타임아웃 시 요청이 실패해야 합니다.
자바에서는 어떻게 하면 좋을까요?
아래와 같은 것을 시도해도 효과가 없을 것 같습니다.
public class TestNodeAliveness {
public static NodeStatus nodeBIT(String elasticIP) throws ClientProtocolException, IOException {
HttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter("http.connection.timeout", 1);
HttpUriRequest request = new HttpGet("http://192.168.20.43");
HttpResponse response = client.execute(request);
System.out.println(response.toString());
return null;
}
public static void main(String[] args) throws ClientProtocolException, IOException {
nodeBIT("");
}
}
-- EDIT: 사용하고 있는 라이브러리를 명확히 합니다.
apache의 httpclient를 사용하고 있습니다.여기 관련 pom.xml 섹션이 있습니다.
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0.1</version>
<type>jar</type>
</dependency>
Http Client 버전 4.3 이후를 사용하고 있는 경우는, 다음을 사용할 필요가 있습니다.
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build();
HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
...
// set the connection timeout value to 30 seconds (30000 milliseconds)
final HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
client = new DefaultHttpClient(httpParams);
HttpParams는 새 Apache HTTPClient 라이브러리에서 더 이상 사용되지 않습니다.Laz가 제공한 코드를 사용하면 권장 해제 경고가 발생합니다.
대신 HttpGet 또는 HttpPost 인스턴스에서 RequestConfig를 사용할 것을 권장합니다.
final RequestConfig params = RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build();
httpPost.setConfig(params);
HttpClient API를 사용하고 있는 것 같습니다만, 저는 전혀 모릅니다만, 이와 비슷한 것을 코어 Java를 사용해 쓸 수 있습니다.
try {
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
con.setConnectTimeout(5000); //set timeout to 5 seconds
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
return false;
} catch (java.io.IOException e) {
return false;
}
Laz에 의한 업이 가장 높은 상기 메서드는 버전 4.3 이후 폐지됩니다.따라서 Request Config Object를 사용하여 HTTP 클라이언트를 구축하는 것이 좋습니다.
private CloseableHttpClient createHttpClient()
{
CloseableHttpClient httpClient;
CommonHelperFunctions helperFunctions = new CommonHelperFunctions();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(306);
cm.setDefaultMaxPerRoute(108);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(15000)
.setSocketTimeout(15000).build();
httpClient = HttpClients.custom()
.setConnectionManager(cm)
.setDefaultRequestConfig(requestConfig).build();
return httpClient;
}
PoolingHttpClientConnectionManager는 루트별 최대 기본 연결 수와 최대 연결 수를 설정하는 사용자입니다.각각 306과 108로 설정했습니다.대부분의 경우 기본값으로는 충분하지 않습니다.
타임아웃 설정의 경우:RequestConfig 오브젝트를 사용하고 있습니다.연결 관리자로부터의 연결 대기 시간 초과를 설정하는 속성 연결 요청 시간 초과를 설정할 수도 있습니다.
은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★HttpConnectionParams
★★★★★★★★★★★★★★★★★」HttpConnectionManager
사용법은 .org.apache.commons.httpclient
§ 3.0.1
는 결국 ★★★★★★★★★★★★★★★★★★★를 사용하게 되었다.java.util.concurrent.ExecutorService
를 HttpClient.executeMethod()
discl.discl.discl을 클릭합니다.
여기 작은 자기 완결형 예가 있습니다.
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;
/**
* @author Jeff Kirby
* @since <pre>Jun 17, 2011</pre>
*/
public class Example {
private static final String SITE = "http://some.website.com/upload";
private static final int TIME_OUT_SECS = 5;
// upload a file and return the response as a string
public String post(File file) throws IOException, InterruptedException {
final Part[] multiPart = { new FilePart("file", file.getName(), file) };
final EntityEnclosingMethod post = new PostMethod(SITE);
post.setRequestEntity(new MultipartRequestEntity(multiPart, post.getParams()));
final ExecutorService executor = Executors.newSingleThreadExecutor();
final List<Future<Integer>> futures = executor.invokeAll(Arrays.asList(new KillableHttpClient(post)), TIME_OUT_SECS, TimeUnit.SECONDS);
executor.shutdown();
if(futures.get(0).isCancelled()) {
throw new IOException(SITE + " has timed out. It has taken more than " + TIME_OUT_SECS + " seconds to respond");
}
return post.getResponseBodyAsString();
}
private static class KillableHttpClient implements Callable<Integer> {
private final EntityEnclosingMethod post;
private KillableHttpClient(EntityEnclosingMethod post) {
this.post = post;
}
public Integer call() throws Exception {
return new HttpClient().executeMethod(post);
}
}
}
이것은 이미 위의 benvoliot의 코멘트에서 언급되었다.하지만, 나는 그것이 확실히 머리를 긁적거리게 만들었기 때문에 그것은 최고 수준의 게시물이라고 생각한다.혹시 다른 사람에게 도움이 될까 봐 글을 올립니다.
와 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.CoreConnectionPNames.CONNECTION_TIMEOUT
이 경우 타임아웃은 완벽하게 동작합니다.서버가 응답하지 않으면 요청이 취소됩니다.
실제로 테스트하려고 했던 서버 코드 안에서 동일한 코드가 타임아웃 되는 일은 없습니다.
소켓 접속 액티비티 타임아웃으로 변경(CoreConnectionPNames.SO_TIMEOUT
(HTTP 접속이 아닌)CoreConnectionPNames.CONNECTION_TIMEOUT
)에서 문제를 해결했습니다.
또한 Apache 문서를 주의 깊게 읽어보십시오.http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html#CONNECTION_TIMEOUT
라고 쓰여 있는 비트에 주의해 주세요.
이 파라미터는 특정 로컬주소에 바인드된 접속에만 적용할 수 있습니다.
내가 겪은 모든 머리를 긁는 다른 사람을 구해주길 바란다.그러면 문서를 꼼꼼히 읽지 않아도 된다는 걸 알게 될 거야!
Op은 나중에 Apache Commons HttpClient 3.0.1을 사용하고 있다고 밝혔다.
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
client.getHttpConnectionManager().getParams().setSoTimeout(5000);
HttpConnectionParams.setSoTimeout(params, 10*60*1000);// for 10 mins i have set the timeout
필요한 타임아웃을 정의할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/3000214/java-http-client-request-with-defined-timeout
'programing' 카테고리의 다른 글
.map()의 요소를 건너뛰는 방법 (0) | 2022.10.29 |
---|---|
MariaDB JDBC 클라이언트로깅 (0) | 2022.10.29 |
PhpMyAdmin을 사용한 Nginx(SSL을 통해 보안 보호) (0) | 2022.10.29 |
현재 날짜 + 7일 반환 (0) | 2022.10.19 |
사전에 값이 있는지 확인하는 방법 (0) | 2022.10.19 |