HttpClient解决并发不足导致交易掉单问题

主要解决金融上游并发不足的问题:



此处分为公有和私有连接池:



私有连接池:



注:首先要在static静态池中放一个存储http连接池的Map

private final static Map<String,PoolingHttpClientConnectionManager> ClientPoolMap = new HashMap<String,PoolingHttpClientConnectionManager>();



/**

* @author: WJJ

* @date: 2017年11月24日 上午9:33:10

* @Description: TODO(调用渠道专属连接池,返回一个连接池)

* @param chcId 渠道专属ClientID

* @param soTimeout

* @param reqTimeout

* @param connectionTimeout

* @param maxClient

* @return

*/

public static PoolingHttpClientConnectionManager getPriHttpClient(String chcId,int soTimeout,int reqTimeout,int connectionTimeout,int maxClient){

PoolingHttpClientConnectionManager priClientPool = ClientPoolMap.get(chcId);//ClientPoolMap(key为chcId,value为对应的私有连接池)

synchronized (chcId){

if(priClientPool==null){

priClientPool = getNewClientPool(maxClient); //获取一个新的连接池

ClientPoolMap.put(chcId, priClientPool);

}

}

return priClientPool;

}





/**

* @author: WJJ

* @date: 2017年11月24日 上午10:03:03

* @Description: TODO(创建新的连接池)

* @param maxClient

* @return

*/

private static PoolingHttpClientConnectionManager getNewClientPool(int maxClient){

PoolingHttpClientConnectionManager priClientPool = new PoolingHttpClientConnectionManager();

priClientPool.setMaxTotal(maxClient);

pubClientPool.setDefaultMaxPerRoute(maxClient);

return priClientPool;

}



/**

* @author: WJJ

* @date: 2017年11月24日 上午10:03:23

* @Description: TODO(根据渠道的连接池返回一个连接)

* @param soTimeout

* @param reqTimeout

* @param connectionTimeout

* @param priClientPool

* @return

*/

public static CloseableHttpClient getNewHttpClient(int soTimeout,int reqTimeout,int connectionTimeout,PoolingHttpClientConnectionManager priClientPool){

CloseableHttpClient httpClient =null;

RequestConfig requestConfig =RequestConfig.custom()

.setSocketTimeout(soTimeout)

.setConnectTimeout(connectionTimeout)

.setConnectionRequestTimeout(reqTimeout)

.build();

httpClient = HttpClients.custom()

.setConnectionManager(priClientPool)

.setConnectionManagerShared(true)

.setDefaultRequestConfig(requestConfig).build();

return httpClient;

}





公有:

首先要在static静态池中创建一个PoolingHttpClientConnectionManager

private static PoolingHttpClientConnectionManager pubClientPool =null;

并在class加载时新建:

static{

String MAX_CLIENT = Configuration.getInstance().getValue("MAX_CLIENT");

Integer maxClient = Integer.parseInt(MAX_CLIENT);

LayeredConnectionSocketFactory sslsf = null;

try {

sslsf = new SSLConnectionSocketFactory(SSLContext.getDefault());

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()

.register("https", sslsf)

.register("http", new PlainConnectionSocketFactory())

.build();

pubClientPool = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

pubClientPool.setMaxTotal(maxClient);

pubClientPool.setDefaultMaxPerRoute(maxClient);

}





/**

* @author: WJJ

* @date: 2017年11月24日 上午9:55:31

* @Description: TODO(调用公用连接池,返回一个连接)

* @param soTimeout

* @param reqTimeout

* @param connectionTimeout

* @return

*/

public static HttpClient getPubHttpClient(int soTimeout,int reqTimeout,int connectionTimeout){

HttpClient httpClient =null;

try{

RequestConfig requestConfig =RequestConfig.custom()

.setSocketTimeout(10000)

.setConnectTimeout(10000)

.setConnectionRequestTimeout(15000)

.build();

httpClient = HttpClients.custom()

.setConnectionManager(pubClientPool)

.setConnectionManagerShared(true)

.setDefaultRequestConfig(requestConfig).build();

}catch(Exception e){

e.printStackTrace();

}

return httpClient;

}





/**

* @author: WJJ

* @date: 2017年11月24日 上午10:20:02

* @Description: TODO(根据传入来的httpClient发送数据)

* @param entity

* @param trans_url

* @param channlClient

* @return

* @throws Exception

*/

public static String doPostByClient(HttpEntity entity, String trans_url,HttpClient channlClient) throws Exception {

HttpPost postMethod = new HttpPost(trans_url);

try {

postMethod.setEntity(entity);

            postMethod.setHeader("connection", "close");//设置这个为了在Httpclient发送后 彻底把tcp链路断掉  不然一直保持会有大量的close_wait出现


HttpResponse resp = channlClient.execute(postMethod);

InputStream inResp=resp.getEntity().getContent();

String str = IOUtils.toString(inResp, URL_PARAM_DECODECHARSET_UTF8);

inResp.close();

int statusCode = resp.getStatusLine().getStatusCode();

if (200 == statusCode) {

return str;



} else {

logger.info("返回错误码:" + statusCode);

throw new Exception("通讯错误" + String.valueOf(statusCode));

}



} catch (Exception e) {

e.printStackTrace();

throw e;

} finally {

if (postMethod != null) {

postMethod.releaseConnection();

}

}

}

猜你喜欢

转载自blog.csdn.net/hell0_wor1d/article/details/79992604