具有定义的超时的Java HTTP客户端请求

我想让我的云中的一些服务器BIT(内置testing)。 我需要这个请求在很大的超时时间内失败。

我应该如何做到这一点与Java?

尝试像下面的东西似乎并没有工作。

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(""); } } 

– 编辑:澄清什么库正在使用 –

我从apache使用httpclient,这里是相关的pom.xml部分

  <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.0.1</version> <type>jar</type> </dependency> 
 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); 

如果你正在使用Http客户端版本4.3及以上,你应该使用这个:

 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build(); HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build(); 

新的Apache HTTPClient库中不推荐使用HttpParams。 使用Laz提供的代码会导致弃用警告。

我build议在您的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; } 

我发现在HttpConnectionParamsHttpConnectionManager设置超时设置并没有解决我们的情况。 我们仅限于使用org.apache.commons.httpclient版本3.0.1。

我结束了使用java.util.concurrent.ExecutorService监视HttpClient.executeMethod()调用。

这是一个小型的,独立的例子

 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); } } } 

Laz最高的方法从版本4.3开始被弃用。 因此,最好使用请求configuration对象,然后构buildHTTP客户端

  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对象。 您还可以设置属性Connection Request Timeout来设置等待Connection Manager连接的超时时间。

这已经在上面的benvoliot的评论中提到了。 但是,我认为这是值得一个顶级职位,因为它确实让我挠了脑袋。 我张贴这个,以防别人帮助别人。

我写了一个简单的testing客户端和CoreConnectionPNames.CONNECTION_TIMEOUT超时在这种情况下完美的作品。 如果服务器没有响应,请求被取消。

在服务器代码中,我实际上正在testing,但是相同的代码永远不会超时。

将其更改为套接字连接活动超时( 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

注意说的那一点

请注意,此参数只能应用于绑定到特定本地地址的连接。

我希望能拯救别人所有的脑袋。 这将教会我不要彻底阅读文档!

HttpConnectionParams.setSoTimeout(params, 10*60*1000);// for 10 mins i have set the timeout

你也可以定义你所需要的时间。

后来Op说他们正在使用Apache Commons HttpClient 3.0.1

  HttpClient client = new HttpClient(); client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); client.getHttpConnectionManager().getParams().setSoTimeout(5000);