springboot整合httpClient代碼實(shí)例
這篇文章主要介紹了springboot整合httpClient代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
創(chuàng)建httpClientConfig配置類
@Configuration @PropertySource(value="classpath:/properties/httpClient.properties") public class HttpClientConfig { @Value("${http.maxTotal}") private Integer maxTotal; //最大連接數(shù) @Value("${http.defaultMaxPerRoute}") private Integer defaultMaxPerRoute; //最大并發(fā)鏈接數(shù) @Value("${http.connectTimeout}") private Integer connectTimeout; //創(chuàng)建鏈接的最大時(shí)間 @Value("${http.connectionRequestTimeout}") private Integer connectionRequestTimeout; //鏈接獲取超時(shí)時(shí)間 @Value("${http.socketTimeout}") private Integer socketTimeout; //數(shù)據(jù)傳輸最長(zhǎng)時(shí)間 @Value("${http.staleConnectionCheckEnabled}") private boolean staleConnectionCheckEnabled; //提交時(shí)檢查鏈接是否可用 //定義httpClient鏈接池 @Bean(name="httpClientConnectionManager") public PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() { PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(); manager.setMaxTotal(maxTotal); //設(shè)定最大鏈接數(shù) manager.setDefaultMaxPerRoute(defaultMaxPerRoute); //設(shè)定并發(fā)鏈接數(shù) return manager; } //定義HttpClient /** * 實(shí)例化連接池,設(shè)置連接池管理器。 * 這里需要以參數(shù)形式注入上面實(shí)例化的連接池管理器 @Qualifier 指定bean標(biāo)簽進(jìn)行注入 */ @Bean(name = "httpClientBuilder") public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){ //HttpClientBuilder中的構(gòu)造方法被protected修飾,所以這里不能直接使用new來(lái)實(shí)例化一個(gè)HttpClientBuilder,可以使用HttpClientBuilder提供的靜態(tài)方法create()來(lái)獲取HttpClientBuilder對(duì)象 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); httpClientBuilder.setConnectionManager(httpClientConnectionManager); return httpClientBuilder; } /** * 注入連接池,用于獲取httpClient * @param httpClientBuilder * @return */ @Bean public CloseableHttpClient getCloseableHttpClient(@Qualifier("httpClientBuilder") HttpClientBuilder httpClientBuilder){ return httpClientBuilder.build(); } /** * Builder是RequestConfig的一個(gè)內(nèi)部類 * 通過(guò)RequestConfig的custom方法來(lái)獲取到一個(gè)Builder對(duì)象 * 設(shè)置builder的連接信息 * @return */ @Bean(name = "builder") public RequestConfig.Builder getBuilder(){ RequestConfig.Builder builder = RequestConfig.custom(); return builder.setConnectTimeout(connectTimeout) .setConnectionRequestTimeout(connectionRequestTimeout) .setSocketTimeout(socketTimeout) .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled); } /** * 使用builder構(gòu)建一個(gè)RequestConfig對(duì)象 * @param builder * @return */ @Bean public RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){ return builder.build(); } }
創(chuàng)建HttpClientClose關(guān)閉配置類
@Component //交給spring容器管理 public class HttpClientClose extends Thread{ @Autowired private PoolingHttpClientConnectionManager manage; private volatile boolean shutdown; //開關(guān) volatitle表示多線程可變數(shù)據(jù),一個(gè)線程修改,其他線程立即修改 public HttpClientClose() { ///System.out.println("執(zhí)行構(gòu)造方法,實(shí)例化對(duì)象"); //線程開啟啟動(dòng) this.start(); } @Override public void run() { try { //如果服務(wù)沒(méi)有關(guān)閉,執(zhí)行線程 while(!shutdown) { synchronized (this) { wait(5000); //等待5秒 //System.out.println("線程開始執(zhí)行,關(guān)閉超時(shí)鏈接"); //關(guān)閉超時(shí)的鏈接 PoolStats stats = manage.getTotalStats(); int av = stats.getAvailable(); //獲取可用的線程數(shù)量 int pend = stats.getPending(); //獲取阻塞的線程數(shù)量 int lea = stats.getLeased(); //獲取當(dāng)前正在使用的鏈接數(shù)量 int max = stats.getMax(); //System.out.println("max/"+max+": av/"+av+": pend/"+pend+": lea/"+lea); manage.closeExpiredConnections(); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } super.run(); } //關(guān)閉清理無(wú)效連接的線程 @PreDestroy //容器關(guān)閉時(shí)執(zhí)行該方法. public void shutdown() { shutdown = true; synchronized (this) { //System.out.println("關(guān)閉全部鏈接!!"); notifyAll(); //全部從等待中喚醒.執(zhí)行關(guān)閉操作; } }
編寫工具類HttpClientService
@Service public class HttpClientService { @Autowired private CloseableHttpClient httpClient; @Autowired private RequestConfig requestConfig; /** * 通過(guò)給的url地址,獲取服務(wù)器數(shù)據(jù) * @param url 服務(wù)器地址 * @param params 封裝用戶參數(shù) * @param charset 設(shè)定字符編碼 * @return */ public String doGet(String url, Map<String,String> params,String charset) { if (StringUtils.isEmpty(charset)) { charset = "utf-8"; } //判斷是否有參數(shù) if (params != null) { url +="?"; for (Map.Entry<String,String> entry: params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); url += key +"="+value+"&"; } url = url.substring(0,url.length() - 1); } HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); String result = ""; try { CloseableHttpResponse response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(response.getEntity(),charset); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } return result; } public String doGet(String url, Map<String,String> params) { return doGet(url,params,null); } public String doGet(String url) { return doGet(url,null,null); } public <T> T doGet(String url,Class<T> tClass,Map<String,String> map, String charSet){ String result = doGet(url,map,charSet); return ObjectMapperUtil.toObject(result, tClass); } }
測(cè)試類:
@SpringBootTest @RunWith(SpringRunner.class) public class HttpClientTest { @Autowired private HttpClientService httpClientService; @Test public void getTest1() { //次url是通過(guò)nginx加hosts文件映射的,需要修改url才可以使用 String url = "http://manage.jt.com/web/item/findItemDescById"; Map<String,String> map = new HashMap<>(); map.put("itemId","562379"); String s = httpClientService.doGet(url, map); System.out.println(s); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例
這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對(duì)字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)
這篇文章主要介紹了Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢實(shí)例詳解
MyBatis-Plus是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在 MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,MyBatis可以無(wú)損升級(jí)為MyBatis-Plus,這篇文章主要給大家介紹了關(guān)于mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢的相關(guān)資料,需要的朋友可以參考下2022-10-10詳解@Autowired(required=false)注入注意的問(wèn)題
這篇文章主要介紹了@Autowired(required=false)注入注意的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程
這篇文章給大家介紹了SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
通常都把隊(duì)列比喻成排隊(duì)買東西,大家都很守秩序,先排隊(duì)的人就先買東西。但是優(yōu)先隊(duì)列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊(duì)列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列,感興趣的朋友一起看看吧2021-08-08深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示
堆排序基于二叉堆結(jié)構(gòu)即完全二叉樹,可利用最大堆和最小堆的組建方式來(lái)進(jìn)行排序,這里就來(lái)深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示2016-06-06