springboot整合httpClient代码实例

网友投稿 562 2023-07-05

springboot整合httpClient代码实例

springboot整合httpClient代码实例

这篇文章主要介绍了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); //设定最大链接数

mahttp://nager.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 params,String charset) {

if (StringUtils.isEmpty(charset)) {

charset = "utf-8";

}

//判断是否有参数

if (params != null) {

url +="?";

for (Map.Entry 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 params) {

return doGet(url,params,null);

}

public String doGet(String url) {

return doGet(url,null,null);

}

public T doGet(String url,Class tClass,Map 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 map = new HashMap<>();

map.put("itemId","562379");

String s = httpClientService.doGet(url, map);

System.out.println(s);

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Mybatis如何传入多个参数的实现代码
下一篇:使用EasyPoi轻松导入导出Excel文档的方法示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~