zoukankan      html  css  js  c++  java
  • Configuring Timeout with Apache HttpClient 4.0

    http://blog.jayway.com/2009/03/17/configuring-timeout-with-apache-httpclient-40/

    Configuring Timeout with Apache HttpClient 4.0

    Mattias Hellborg Arthursson

    Great news everyone: just recently an all-new version of Apache HttpClient was released. HttpClient is now part of the new initiative Apache HttpComponents, which seems to aim for a complete approach to Http programming in Java; server side as well as client side.

    I've used Commons HttpClient in older versions on several occasions in the past and have found it to be extremely useful. I've only just started working with the new version, but there seems to quite a lot of good stuff in there. For example I'm thrilled to see that the Template pattern, heavily used in Spring, has now made its way to the Apache world (e.g. ResponseHandler, a callback interface to be used with HttpClient for handling results).

    Now, configuration of HttpClient has always been a little bit tricky. There are so many features in there, and most of these are configured using generic parameters (HttpParams), basically name-value pairs of a setting identifier and its value. This has not been made that much easier in the new version.

    In my current project I was struggling to find the appropriate parameters for configuring timeouts with the new version of the framework. It turned out to be quite difficult to find clear information on this - the documentation on the 4.0 version of HttpClient is still quite sparse. Since it took me a while to find out how to do this I figured I wasn't alone, so here goes:

    My original solution for this problem - being completely unable to find the proper way to do it - was to use the hard-coded property values and set them as parameters in HttpParams. Fortunately, a reader with signature 'BoD' (see below) knew the right way to do this and was kind enough to share.

    Right, the code looks as follows:

     
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeoutMillis);
    HttpConnectionParams.setSoTimeout(httpParams, socketTimeoutMillis);
     

    Simple as that - hard to understand why that should take me so long to figure out :) . Thanks again to 'BoD' for setting me straight on this.

    Mattias Hellborg Arthursson
    Consultant at Jayway

    Tags: 4.0, apache, configuration, httpclient, programming, timeout

    12 comments ↓

    #1 BoD on 03.28.09 at 2:38

    A better version is:

    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeoutMillis);
    HttpConnectionParams.setSoTimeout(httpParams, socketTimeoutMillis);
    HttpClient httpClient = new DefaultHttpClient(httpParams);

    Which does the same, but avoids using hard-coded strings that may even change with the library!

    #2 Mattias Hellborg Arthursson on 03.30.09 at 15:42

    Ah, excellent! That was just the thing I was looking for. I completely agree that the hard-coded stuff should be avoided; I was just completely unable to find out how to do it properly. Thanks.

    #3 Oguen on 04.08.09 at 11:16

    Thank you, exactly what i was looking for !

    #4 Peter on 06.15.09 at 1:42

    Well, If you guys are lazy and want auto generation of your Apache HttpClient code, use HTTP4E:

    It is an awesome Eclipse plugin. It has tabs, syntax coloring, auto suggest, and most importantly you can create an HTTP, REST call in 5 seconds. And when you have an HTTP call the one-click Java code generation just rocks. The code generated is pure Apache HttpClient code, as the tool is build on top of Apache HttpClient.

    You can use it for HTTP tampering, hacking, having fun with it.

    http://http4e.roussev.org/

    #5 Mattias Hellborg Arthursson on 06.15.09 at 12:09

    Well, I’m generally not too happy about generated code – if the API is too complicated to use with proper code the API should be simplified. Typically, HttpClient is in this category, which is why simplification is included in Spring’s RestTemplate (included in the upcoming Spring 3.0): http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/client/RestTemplate.html

    That said, I tried the plugin out just now and I really like the it for troubleshooting and testing out e.g. rest servers. Looks pretty sweet.

    #6 Bram Luyten on 12.14.10 at 18:03

    just what I was looking for, thanks for blogging Mattias

    #7 Thuy on 02.17.11 at 0:02

    Thanks for the article. Just switched to apache httpclient 4.1. Just a correction on your code (should be params rather than httpParams) :

    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
    HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);

    #8 Brijesh on 02.25.11 at 10:32

    How can i specify source IP address for HttpClient ?
    My requirement is that i want to originate http request from specific Ip address.

    thanks

    #9 steve on 06.05.11 at 21:26

    Just found this from a google search. Just a quick message to say thanks, worked perfectly here

    #10 Anon on 06.21.11 at 17:37

    Likewise, just to say it worked and to thank you!

    #11 Troy on 10.03.11 at 0:29

    @Brijesh:

    Specifying source route:
    ConnRoutePNames.LOCAL_ADDRESS=’http.route.local-address’: defines a local address to be used by all default route planner. On machines with multiple network interfaces, this parameter can be used to select the network interface from which the connection originates. This parameter expects a value of type java.net.InetAddress. If this parameter is not set, a default local address will be used automatically.

    #12 mente on 10.11.11 at 13:07

    For spring integration you can use HttpConnectionParamBean

  • 相关阅读:
    Effective C++笔记:继承与面向对象设计
    华为手机连不上adb解决方法
    android手机出现sqlite3 not found的解决方法
    adb permission denied
    Apache2.4为什么启动报错Cannot load php5apache2_4.dll into server
    界面排版-TableLayout的stretchColumns方法
    java中静态代码块的用法 static用法详解(转)
    Activity not started, its current task has been brought to the front
    (转)在低版本的SDK里使用高版本函数@SuppressLint("NewApi") or @TargetApi?
    Android笔记:解决 Your project contains error(s),please fix them before running your application问题
  • 原文地址:https://www.cnblogs.com/lexus/p/2337657.html
Copyright © 2011-2022 走看看