gpt4 book ai didi

java - 如何有效地将 HttpComponentsClientHttpRequestFactory 与 RestTemplate 一起使用?

转载 作者:行者123 更新时间:2023-11-30 08:54:18 31 4
gpt4 key购买 nike

我正在使用 RestTemplate及其工厂HttpComponentsClientHttpRequestFactory在我的一个项目中。在这个项目中,我需要对运行 restful 服务的服务器进行 Http url 调用,该服务将响应作为 JSON 字符串返回。

下面是我的代码-

public class GetUserClientData {

public String getData(KeyHolder keys) {
return new HTTPRequestAccess(keys).makeHttpRequest();
}
}

下面是我的类,它包装了 HttpClient 部分 -

public class HTTPRequestAccess {

// should this be static?
private RestTemplate restTemplate;
private KeyHolder keys;
private int timeout;

public HTTPRequestAccess(KeyHolder keys){
this(keys.getTimeoutValue()); // setting timeout to RestTemplate
this.keys = keys;
}

public HTTPRequestAccess(int timeout) {
this.timeout = timeout;
restTemplate = new RestTemplate(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
// is this not expensive that every time we are creating this new object?
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(timeout);
factory.setConnectTimeout(timeout);
return factory;
}

public String makeHttpRequest() {
String response = null;
try {
// some logic here

String url = generateURL();
response = restTemplate.getForObject(url, String.class);

// some logic here
} catch (RestClientException ex) {
// log exception and do some stuff
} catch (Exception ex) {
// log exception
}

return response;
}
}

RestTemplateHttpComponentsClientHttpRequestFactory 在我的 HTTPRequestAccess 类中是否应该是静态的,就像我看到的一样,我正在重新创建整个连接池RestTemplate 中的每个请求我猜这不是正确的方式,因为每个工厂都有连接和线程池,我猜它们是相当重的对象。

一般来说,在多线程环境中使用 RestTemplate 及其工厂 HttpComponentsClientHttpRequestFactory 的最佳方式是什么?我猜 RestTemplate 是线程安全的,但我不认为 HttpComponentsClientHttpRequestFactory 是线程安全的。如果我错了,请纠正我?我将在重负载下运行这个库。

我正在使用 spring-web-3.2.8.RELEASE 版本。

最佳答案

在我的一个项目中,我创建了 HttpComponentsClientHttpRequestFactory 的静态实例并将其传递给每个 RestTemplate。虽然,在 here ,建议也有一个 RestTemplate 的全局实例。

可能无关紧要,但重要的一点是在构造 HttpComponentsClientHttpRequestFactory 时将 HttpClients.createDefault() 传递给它,因为默认情况下,该工厂使用系统属性为您的工厂创建 HttpClient,这可能会在生产环境中造成很多痛苦.您也可以传递您的自定义 HttpClient。

关于java - 如何有效地将 HttpComponentsClientHttpRequestFactory 与 RestTemplate 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29466443/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com