温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

springboot中怎么整合httpClient

发布时间:2021-06-11 16:22:23 来源:亿速云 阅读:252 作者:Leah 栏目:编程语言

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);   }

看完上述内容,你们掌握springboot中怎么整合httpClient的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI