springboot整合HttpAsyncClient簡單實用


1、pom添加內容

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpasyncclient</artifactId> <version>4.1</version> </dependency> 

2、創建httpUtil


public class HttpUtil { private static int socketTimeout = 1000;// 設置等待數據超時時間5秒鍾 根據業務調整 private static int connectTimeout = 2000;// 連接超時 private static int poolSize = 100;// 連接池最大連接數 private static int maxPerRoute = 10;// 每個主機的並發最多10 /** * 創建非異步的可關閉的且跳過https 驗證的 httpClient * @return */ public static CloseableHttpClient createSSLClientDefault() { try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); return HttpClients.custom().setSSLSocketFactory(sslsf).build(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } return HttpClients.createDefault(); } /** * 創建異步的可關閉的跳過https驗證的 httpClient對象 * @param connManager 連接管理器 可以調用本類的getConnManager 生成 * @return */ public static CloseableHttpAsyncClient getClient(PoolingNHttpClientConnectionManager connManager) { if (null == connManager) { return null; } // 設置連接參數 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(HttpUtil.socketTimeout).setConnectTimeout(HttpUtil.connectTimeout).build(); // 創建自定義的httpclient對象 CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig) .setConnectionManager(connManager).disableCookieManagement().build(); return client; } /** * 創建異步的可關閉的跳過https驗證的 httpClient對象(綁定本地網卡) * @param connManager * @param localAddress * @return * @throws */ public static CloseableHttpAsyncClient getClient(PoolingNHttpClientConnectionManager connManager, String localAddress) throws UnknownHostException { if (null == connManager || null == localAddress) { return null; } String[] ipStrArr = localAddress.split("\\."); if(ipStrArr.length != 4){ return null; } byte[] ip = new byte[]{ (byte)(Integer.parseInt(ipStrArr[0])), (byte) (Integer.parseInt(ipStrArr[1])), (byte) (Integer.parseInt(ipStrArr[2])), (byte) (Integer.parseInt(ipStrArr[3])) }; // 設置連接參數 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(HttpUtil.socketTimeout).setConnectTimeout(HttpUtil.connectTimeout).setLocalAddress(InetAddress.getByAddress(ip)).build(); // 創建自定義的httpclient對象 CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig) .setConnectionManager(connManager).disableCookieManagement().build(); return client; } /** * 初始化 連接管理器 * @return */ public static PoolingNHttpClientConnectionManager getConnManager() { try { // 繞過證書驗證,處理https請求 SSLContext sslcontext = createIgnoreVerifySSL(); // 設置協議http和https對應的處理socket鏈接工廠的對象 Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder .<SchemeIOSessionStrategy> create().register("http", NoopIOSessionStrategy.INSTANCE) .register("https", new SSLIOSessionStrategy(sslcontext, new AllowAllHostnameVerifier())).build(); // 配置io線程 IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setConnectTimeout(HttpUtil.socketTimeout).setSoTimeout(HttpUtil.connectTimeout) .setRcvBufSize(8192).setSndBufSize(8192).build(); // 設置連接池大小 ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig); PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor, null, sessionStrategyRegistry, null); connManager.setDefaultMaxPerRoute(maxPerRoute); connManager.setMaxTotal(poolSize); return connManager; } catch (IOReactorException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 繞過驗證 * * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException */ public static SSLContext createIgnoreVerifySSL() { SSLContext sc = null; try { sc = SSLContext.getInstance("TLS"); // 實現一個X509TrustManager接口,用於繞過驗證,不用修改里面的方法 X509TrustManager trustManager = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) { } @Override public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; sc.init(null, new TrustManager[] { trustManager }, null); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sc; } /** * 從 request請求對象 中獲取ip地址 * @param request * @return */ public static String getIpAddress(HttpServletRequest request) { if(request==null){ return null; } String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } } 

3、創建一個提供外部獲取httpClient接口

/** * AsynHttpClient工廠類 */ @Component public class AsynHttpClientFactory { private static Logger logger = LoggerFactory.getLogger(AsynHttpClientFactory.class); private static CloseableHttpAsyncClient httpclient; private PoolingNHttpClientConnectionManager connManager; public AsynHttpClientFactory() { connManager = HttpUtil.getConnManager(); httpclient = HttpUtil.getClient(connManager); httpclient.start(); logger.info("異步httpClient啟動完成"); } public static CloseableHttpAsyncClient getCloseableHttpAsyncClient(){ return httpclient; } } 

4、測試方法

單個url發送

 @Test public void run(){ CloseableHttpAsyncClient httpClient =AsynHttpClientFactory.getCloseableHttpAsyncClient(); long startTime = System.currentTimeMillis(); final HttpGet request = new HttpGet("http://www.apache.org"); final Future future = httpClient.execute(request, null); try { HttpResponse response = (HttpResponse) future.get(); System.out.println("Response:" + request.getURI()+"; "+ response.getStatusLine()); System.out.println("Shutting down"); } catch (Exception ex) { System.out.println(ex.getMessage()); }finally{ try { httpClient.close(); } catch (IOException ex) { System.out.println(ex.getMessage()); } } long endTime = System.currentTimeMillis(); System.out.println("執行完畢, 耗時:"+(endTime-startTime)/1000+" 秒"); } 

多條url發送

 @Test public void moreRequest(){ CloseableHttpAsyncClient httpClient =AsynHttpClientFactory.getCloseableHttpAsyncClient(); long startTime = System.currentTimeMillis(); final HttpGet[] requests = new HttpGet[10]; for (int i = 0; i < requests.length; i++) { requests[i] = new HttpGet("http://www.apache.org/"); } final CountDownLatch latch = new CountDownLatch(requests.length); for(final HttpGet request: requests){ httpClient.execute(request, new FutureCallback(){ @Override public void completed(Object obj) { final HttpResponse response = (HttpResponse)obj; latch.countDown(); System.out.println(request.getURI() + "->" + response.getStatusLine()); } @Override public void failed(Exception excptn) { latch.countDown(); System.out.println(request.getURI() + "->" + excptn); } @Override public void cancelled() { latch.countDown(); System.out.println(request.getURI() + "cancelled"); } }); } try { latch.await(); System.out.println("Shutting Down"); } catch (InterruptedException ex) { System.out.println(ex.getMessage()); }finally{ try { httpClient.close(); } catch (IOException ex) { System.out.println(ex.getMessage()); } } long endTime = System.currentTimeMillis(); System.out.println("執行完畢, 耗時:"+(endTime-startTime)/1000+" 秒"); }


作者:Steven_sunlu
鏈接:https://www.jianshu.com/p/0ad167223f69
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM