RestTemplate实践

671 阅读1分钟

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

ClientHttpRequestFactory

RestTemplate可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。

ClientHttpRequestFactory接口主要提供了两种实现方式:

  • SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。

  • HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。

HttpComponentsClientHttpRequestFactory方式

HttpClient配置连接池

@Component("httpClientFactory")
public class HttpClientFactoryBean extends DefaultConnectionKeepAliveStrategy implements FactoryBean<HttpClient>,
    Runnable, InitializingBean, DisposableBean{
/**
 * 保持最多的连接数
 */
private static final int CONNECTION_MAX_TOTAL = 50;

/**
 * domain最多连接数
 */
private static final int CONNECTION_MAX_ROUTE = 10;

/**
 * 空闲时间
 */
private static final int IDLE_TIMEOUT = 30 * 1000;

private ScheduledExecutorService service;

private PoolingHttpClientConnectionManager connectionManager;

private HttpClient httpClient;

@Override
public HttpClient getObject(){

    HttpClientBuilder builder = HttpClients.custom();

    builder.setKeepAliveStrategy(this);
    builder.setConnectionManager(connectionManager);

    httpClient = builder.build();

    return httpClient;
}

@Override
public void afterPropertiesSet(){
    service = new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat("httpclient-%d").build());
    service.scheduleWithFixedDelay(this, 60, 60, TimeUnit.SECONDS);

    connectionManager = new PoolingHttpClientConnectionManager();

    connectionManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(10 * 1000).build());
    connectionManager.setDefaultConnectionConfig(ConnectionConfig.custom().setBufferSize(8 * 1024)
            .setFragmentSizeHint(8 * 1024).build());
    connectionManager.setMaxTotal(CONNECTION_MAX_TOTAL);
    connectionManager.setDefaultMaxPerRoute(CONNECTION_MAX_ROUTE);

}

@Override
public void destroy() {
    service.shutdownNow();
    connectionManager.close();
}

@Override
public Class<HttpClient> getObjectType() {
    return HttpClient.class;
}

@Override
public boolean isSingleton() {
    return true;
}

@Override
public void run() {

    if (connectionManager == null) {
        return;

    }
    connectionManager.closeExpiredConnections();
    connectionManager.closeIdleConnections(IDLE_TIMEOUT, TimeUnit.SECONDS);

}

}

配置RestTemplate

@Component
public class RestRequest extends RestTemplate {

@Autowired
@Qualifier("httpClientFactory")
private HttpClientFactoryBean httpClientFactory;

@PostConstruct
public void init() throws Exception {

	HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClientFactory.getObject());

	setRequestFactory(factory);

	List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
	converters.add(new FastJsonHttpMessageConverter4());

	setMessageConverters(converters);

	setErrorHandler(new ResponseErrorHandler());

}

}