主要解决金融上游并发不足的问题: | |
此处分为公有和私有连接池: | |
私有连接池: | |
注:首先要在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(); | |
} | |
} | |
} |
HttpClient解决并发不足导致交易掉单问题
猜你喜欢
转载自blog.csdn.net/hell0_wor1d/article/details/79992604
今日推荐
周排行