??????Java????????????????????????????????MINA??NETTY??GRIZZLY????????????????????????????Щ?????????????????original???????????(????????????????java.net.*???)???????????????????HttpComponents????????????????HttpClient????????綼???????ɡ?HttpComponents??HttpClient??”??“?е???guava??google-collection??????????HttpComponents?????Apache???????????????????????HttpЭ??????Java??????????????????????????????????????????????????(????HttpCore-bio??HttpCore-nio??HttpClient??HttpMIme??HttpCookie??)?????????????????(?????????ssl)

????HttpClient???????Connection management??Status management??Authentication Management??????????????????????η?????????????????????????(?????????httpClient 3??httpClient 4???д?????)?????????????????????Client????ɡ??????????????????apache??MPM IO?????в?????????????

??????????httpClient 4??????????????:

????[java] view plaincopyprint?

????/**

????* @author von gosling 2012-3-2

????*/

????public class HttpComponentsClientExecutor implements DisposableBean {

????private static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 100;

????private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 5; //notice IE 6??7??8

????private static final int DEFAULT_CONN_TIMEOUT_MILLISECONDS = 5 * 1000;

????private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = 60 * 1000;

????private static final String HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";

????private static final String ENCODING_GZIP = "gzip";

????private HttpClient httpClient;

????/**

????* Create a new instance of the HttpComponentsClient with a default

????* {@link HttpClient} that uses a default

????* {@link org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager}.

????*/

????public HttpComponentsClientExecutor() {

????SchemeRegistry schemeRegistry = new SchemeRegistry();

????schemeRegistry.register(new Scheme("http"?? 80?? PlainSocketFactory.getSocketFactory()));

????schemeRegistry.register(new Scheme("https"?? 443?? SSLSocketFactory.getSocketFactory()));

????ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(

????schemeRegistry);

????connectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTIONS);

????connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);

????this.httpClient = new DefaultHttpClient(connectionManager);

????setConnectTimeout(DEFAULT_CONN_TIMEOUT_MILLISECONDS);

????setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);

????}

????/**

????* Create a new instance of the HttpComponentsClient with the given

????* {@link HttpClient} instance.

????*

????* @param httpClient the HttpClient instance to use for this request

????*/

????public HttpComponentsClientExecutor(HttpClient httpClient) {

????Validate.notNull(httpClient?? "HttpClient must not be null");

????//notice: if you want to custom exception recovery mechanism

????//you should provide an implementation of the HttpRequestRetryHandler interface.

????this.httpClient = httpClient;

????}

????/**

????* Set the {@code HttpClient} used by this request.

????*/

????public void setHttpClient(HttpClient httpClient) {

????this.httpClient = httpClient;

????}

????/**

????* Return the {@code HttpClient} used by this request.

????*/

????public HttpClient getHttpClient() {

????return this.httpClient;

????}

????/**

????* Set the connection timeout for the underlying HttpClient. A timeout value

????* of 0 specifies an infinite timeout.

????*

????* @param timeout the timeout value in milliseconds

????*/

????public void setConnectTimeout(int timeout) {

????Validate.isTrue(timeout >= 0?? "Timeout must be a non-negative value");

????getHttpClient().getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT??

????timeout);

????}

????/**

????* Set the socket timeout (SO_TIMEOUT) in milliseconds?? which is the timeout

????* for waiting for data or?? put differently?? a maximum period inactivity

????* between two consecutive data packets.A timeout value of 0 specifies an

????* infinite timeout.

????*

????* @param timeout the timeout value in milliseconds

????*/

????public void setReadTimeout(int timeout) {

????Validate.isTrue(timeout >= 0?? "Timeout must be a non-negative value");