这里有两种封装,分别是:
1:建立异步Http请求客户端之后,所有http请求都复用该HttpAsyncClient,内部只对应一个Reactor I/O线程。
请求的回调函数中不关闭HttpAsyncClient。
2:每次请求都建立一个新的HttpAsyncClient,请求回调结束后关闭HttpAsyncClient,释放资源。
在我的项目中,我选择第一种:复用单例HttpAsyncClient,因为一个Reactor I/O线程其实可以
同时处理成千上万个连接请求,完全满足我的项目需要。
一、单例HttpAsyncClient
package com.peas.pay.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import lombok.extern.log4j.Log4j;
/**
* Created by xiekunliang on 2018/3/24. 异步Http请求封装工具类
*/
@Log4j
public class AsyncHttpClientUtil
{
private static CloseableHttpAsyncClient httpClient;
private static volatile boolean isClientStart;
/**
* 创建CloseableHttpAsyncClient
* @return
*/
private static CloseableHttpAsyncClient createCustomAsyncClient()
{
Preconditions.checkState(!isClientStart, "客户端HttpAsyncClient已经建立过了");
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
.setIoThreadCount(Runtime.getRuntime().availableProcessors())
.setConnectTimeout(60000)
.setSoTimeout(60000)
.build();
// 设置超时时间 毫秒为单位
RequestConfig requestConfig = RequestConfig
.copy(RequestConfig.DEFAULT)
.setConnectTimeout(60000)
.build();
return HttpAsyncClients
.custom()
.setDefaultIOReactorConfig(ioReactorConfig)
.setDefaultRequestConfig(requestConfig)
.build();
}
public static void startHttpClient()
{
httpClient = createCustomAsyncClient();