欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合httpClient代碼實(shí)例

 更新時(shí)間:2019年12月17日 11:18:48   作者:專注菜鳥  
這篇文章主要介紹了springboot整合httpClient代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了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)Z字形掃描程序

    java實(shí)現(xiàn)Z字形掃描程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Z字形掃描程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例

    java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例

    這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對(duì)字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)

    Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)

    這篇文章主要介紹了Mybatis自動(dòng)創(chuàng)建表和更新表結(jié)構(gòu)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • mybatis-plus自帶QueryWrapper自定義sql實(shí)現(xiàn)復(fù)雜查詢實(shí)例詳解

    mybatis-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
  • 如何使用XPath提取xml文檔數(shù)據(jù)

    如何使用XPath提取xml文檔數(shù)據(jù)

    這篇文章主要介紹了如何使用XPath提取xml文檔數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳解@Autowired(required=false)注入注意的問(wèn)題

    詳解@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-04
  • SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程

    SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程

    這篇文章給大家介紹了SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細(xì)過(guò)程,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列

    java數(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)演示

    深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示

    堆排序基于二叉堆結(jié)構(gòu)即完全二叉樹,可利用最大堆和最小堆的組建方式來(lái)進(jìn)行排序,這里就來(lái)深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示
    2016-06-06
  • Java與kotlin詳細(xì)對(duì)比

    Java與kotlin詳細(xì)對(duì)比

    這篇文章主要介紹了Java與kotlin詳細(xì)對(duì)比,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評(píng)論