springboot整合httpClient


創建httpClientConfig配置類

@Configuration
@PropertySource(value="classpath:/properties/httpClient.properties")
public class HttpClientConfig {
    @Value("${http.maxTotal}")
    private Integer maxTotal;                        //最大連接數

    @Value("${http.defaultMaxPerRoute}")
    private Integer defaultMaxPerRoute;                //最大並發鏈接數

    @Value("${http.connectTimeout}")
    private Integer connectTimeout;                    //創建鏈接的最大時間

    @Value("${http.connectionRequestTimeout}") 
    private Integer connectionRequestTimeout;        //鏈接獲取超時時間

    @Value("${http.socketTimeout}")
    private Integer socketTimeout;                      //數據傳輸最長時間

    @Value("${http.staleConnectionCheckEnabled}")
    private boolean staleConnectionCheckEnabled;     //提交時檢查鏈接是否可用

    //定義httpClient鏈接池
    @Bean(name="httpClientConnectionManager")
    public PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() {
        PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();
        manager.setMaxTotal(maxTotal);  //設定最大鏈接數
        manager.setDefaultMaxPerRoute(defaultMaxPerRoute);  //設定並發鏈接數
        return manager;
    }

    //定義HttpClient
    /**
     * 實例化連接池,設置連接池管理器。
     * 這里需要以參數形式注入上面實例化的連接池管理器
      @Qualifier 指定bean標簽進行注入
     */
    @Bean(name = "httpClientBuilder")
    public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){

        //HttpClientBuilder中的構造方法被protected修飾,所以這里不能直接使用new來實例化一個HttpClientBuilder,可以使用HttpClientBuilder提供的靜態方法create()來獲取HttpClientBuilder對象
        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的一個內部類
      * 通過RequestConfig的custom方法來獲取到一個Builder對象
      * 設置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構建一個RequestConfig對象
     * @param builder
     * @return
     */
    @Bean
    public RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){
        return builder.build();
    }
}

創建HttpClientClose關閉配置類

@Component    //交給spring容器管理
public class HttpClientClose extends Thread{
    @Autowired
    private PoolingHttpClientConnectionManager manage;
    private volatile boolean shutdown;    //開關 volatitle表示多線程可變數據,一個線程修改,其他線程立即修改
    
    public HttpClientClose() {
        ///System.out.println("執行構造方法,實例化對象");
        //線程開啟啟動
        this.start();
    }
    
    
    @Override
    public void run() {
        try {
            //如果服務沒有關閉,執行線程
            while(!shutdown) {
                synchronized (this) {
                    wait(5000);            //等待5秒
                    //System.out.println("線程開始執行,關閉超時鏈接");
                    //關閉超時的鏈接
                    PoolStats stats = manage.getTotalStats();
                    int av = stats.getAvailable();    //獲取可用的線程數量
                    int pend = stats.getPending();    //獲取阻塞的線程數量
                    int lea = stats.getLeased();    //獲取當前正在使用的鏈接數量
                    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();
    }

    //關閉清理無效連接的線程
    @PreDestroy    //容器關閉時執行該方法.
    public void shutdown() {
        shutdown = true;
        synchronized (this) {
            //System.out.println("關閉全部鏈接!!");
            notifyAll(); //全部從等待中喚醒.執行關閉操作;
        }
    }

編寫工具類HttpClientService

@Service
public class HttpClientService {

    @Autowired
    private CloseableHttpClient httpClient;
    @Autowired
    private RequestConfig requestConfig;

    /**
     * 通過給的url地址,獲取服務器數據
     * @param url 服務器地址
     * @param params 封裝用戶參數
     * @param charset 設定字符編碼
     * @return
     */
    public String doGet(String url, Map<String,String> params,String charset) {
        if (StringUtils.isEmpty(charset)) {
            charset = "utf-8";
        }
        //判斷是否有參數
        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);
    }

}

測試類:

@SpringBootTest
@RunWith(SpringRunner.class)
public class HttpClientTest {
@Autowired
private HttpClientService httpClientService;
@Test
public void getTest1() {     //次url是通過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); }


免責聲明!

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



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