如何在Apache http客户端中设置连接超时?

12

我希望使用HTTPClient运行线程安全的异步HTTP请求。但是我发现它不会遵循我的CONNECTION_TIMEOUT参数。

代码是ColdFusion / Java混合编写的。

client = loader.create("org.apache.http.impl.nio.client.DefaultHttpAsyncClient").init();
CoreConnectionPNames = loader.create("org.apache.http.params.CoreConnectionPNames");

client.getParams()
      .setIntParameter(JavaCast("string", CoreConnectionPNames.SO_TIMEOUT), 10)
      .setIntParameter(JavaCast("string", CoreConnectionPNames.CONNECTION_TIMEOUT), 10);

client.start();

request = loader.create("org.apache.http.client.methods.HttpGet").init("http://www.google.com");
future = client.execute(request, javacast("null", ""));

try {
   response = future.get();
}
catch(e any) {}

client.getConnectionManager().shutdown();

无论我为 CONNECTION_TIMEOUT 提供什么值,请求总是返回200 OK。请检查下面的输出。

  1. 如何设置有效的连接超时?
  2. CONNECTION_TIMEOUT 有用吗?

输出

200 OK http://www.google.com/

200 OK http://www.google.com/

[snip]

5 requests using Async Client in: 2308 ms
2个回答

3

Apache的HttpClient文档有些不完整。在您的设置中尝试以下内容(它在4版本中对我有效):

HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);

... set more parameters here if you want to ...

SchemeRegistry schemeRegistry = new SchemeRegistry();

.. do whatever you ant with the scheme registry here ...

ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(params, schemeRegistry);

client = new DefaultHttpClient(connectionManager, params);

谢谢。我正在尝试您的代码,但是将其翻译成CF需要额外的工作。请耐心等待。在前两行中,“HTTPConnectionParams”是我需要创建的对象。可能是“org.apache.http.params.*”,但是您提供给“setConnectionTimeout”的“params”参数从哪里来?如果我把它扔进去,否则它会抛出“params未定义”的错误...如果这听起来很难懂,请原谅,但是使用java / CF混合代码非常繁琐。此外,SchemeRegistry对象是否必要,我可以将其省略吗? - Mohamad
HttpParams params = new BasicHttpParams(); 这里有更多的信息:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html,javadoc在这里:http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/HttpParams.html - Seth

2

您需要使用框架的类方法定义一个 HttpParams 对象。

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpConnectionParams.setConnectionTimeout(params, 2000);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        HttpClient client = DefaultHttpClient(ccm, params);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接