Java tutorial
// Copyright (c) 2003-2013, LogMeIn, Inc. All rights reserved. // This is part of Xively4J library, it is under the BSD 3-Clause license. package com.xively.client.http; import org.apache.http.client.HttpClient; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.HttpClients; import com.xively.client.AppConfig; /** * Class for creating HttpClient and allowing downstream application to * configure HTTP client behaviours such as retry and timeouts, abstracted from * underlying implementation. * * * @author s0pau */ public class HttpClientBuilder { private static final int DEFAULT_CONNECTION_TIMEOUT_IN_MS = 3000; private static final int DEFAULT_SOCKET_TIMEOUT_IN_MS = 3000; private HttpRequestRetryHandler retryHandler; private CloseableHttpClient httpClient; private int socketTimeout; private int connectionTimeout; private static HttpClientBuilder instance; private HttpClientBuilder() { Integer userConnectionTimeout = AppConfig.getInstance().getConnectionTimeout(); connectionTimeout = userConnectionTimeout == null ? DEFAULT_CONNECTION_TIMEOUT_IN_MS : userConnectionTimeout; Integer userSocketTimeout = AppConfig.getInstance().getSocketTimeout(); socketTimeout = userSocketTimeout == null ? DEFAULT_SOCKET_TIMEOUT_IN_MS : userSocketTimeout; } public static HttpClientBuilder getInstance() { if (instance == null) { instance = new HttpClientBuilder(); } return instance; } /** * @param retryCount * number of retries to be attempted by the http client */ public void setRetryCount(int retryCount) { retryHandler = new DefaultHttpRequestRetryHandler(retryCount, false); } /** * @param connectionTimeout * number of milliseconds before timeout when establising * connection, default is DEFAULT_CONNECTION_TIMEOUT_IN_MS */ public void setConnectionTimeout(int connectionTimeout) { this.connectionTimeout = connectionTimeout; } /** * @param socketTimeout * number of milliseconds before timeout when waiting for packet * response, default is DEFAULT_SOCKET_TIMEOUT_IN_MS */ public void setSocketTimeout(int socketTimeout) { this.socketTimeout = socketTimeout; } /** * @return an HttpClient with config as specified in this builder */ HttpClient getHttpClient() { if (httpClient == null) { httpClient = HttpClients.custom().setRetryHandler(retryHandler).build(); if (retryHandler == null) { retryHandler = new DefaultHttpRequestRetryHandler(0, false); } //httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectionTimeout); //httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, socketTimeout); } return httpClient; } }