Java SimpleClientHttpRequestFactory与HttpComponentHttpRequestFactory对RestTemplate的Http请求超时?
我正在从事一个项目,在这个项目中,我需要对运行Restful服务的服务器进行HTTP URL调用,该服务将响应作为Java SimpleClientHttpRequestFactory与HttpComponentHttpRequestFactory对RestTemplate的Http请求超时?,java,multithreading,spring,httprequest,resttemplate,Java,Multithreading,Spring,Httprequest,Resttemplate,我正在从事一个项目,在这个项目中,我需要对运行Restful服务的服务器进行HTTP URL调用,该服务将响应作为JSON字符串返回 下面是我使用future和callables的主要代码: public class TimeoutThreadExample { private ExecutorService executor = Executors.newFixedThreadPool(10); private RestTemplate restTemplate = new
JSON字符串
返回
下面是我使用future和callables的主要代码:
public class TimeoutThreadExample {
private ExecutorService executor = Executors.newFixedThreadPool(10);
private RestTemplate restTemplate = new RestTemplate();
public String getData() {
Future<String> future = executor.submit(new Task(restTemplate));
String response = null;
try {
response = future.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return response;
}
}
问题陈述:
正如您在上面看到的,我使用默认方式执行URL,使用的是restemplate
,它不使用任何Http请求超时,这意味着它在内部使用-1
作为读取
和连接
超时
现在我想做的是,我想在上面的代码中使用restemplate
有效地设置Http请求超时。我不确定需要使用哪个类,我可以看到httpcomponents客户端httprequestfactory
和SimpleClientHttpRequestFactory
,所以不确定需要使用哪个类
基于以上代码的任何简单示例都将帮助我更好地理解如何使用restemplate
设置Http请求超时
我的Http请求超时值是否应该小于将来的超时值
vshttpcomponents客户端httprequestfactory
。用哪一个SimpleClientHttpRequestFactory
- 我的Http请求超时值是否应小于将来的超时值
SimpleClientHttpRequestFactory
,这取决于HttpURLConnection
的默认配置
您可以使用以下属性对其进行配置:
-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec
如果要使用HttpComponents客户端HttpRequestFactory
,它有一个连接池配置,而SimpleClientHttpRequestFactory
没有
使用HttpComponents客户端HttpRequestFactory的示例代码
:
public class TimeoutThreadExample {
private ExecutorService executor = Executors.newFixedThreadPool(10);
private static final RestTemplate restTemplate = createRestTemplate();
private static RestTemplate createRestTemplate(){
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(READ_TIME_OUT);
requestFactory.setConnectTimeout(CONNECTION_TIME_OUT);
return new RestTemplate(requestFactory);
}
public String getData() {
Future<String> future = executor.submit(new Task(restTemplate));
String response = null;
try {
response = future.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return response;
}
}
公共类超时线程示例{
私有ExecutorService executor=Executors.newFixedThreadPool(10);
私有静态最终RestTemplate RestTemplate=createRestTemplate();
私有静态RestTemplate createRestTemplate(){
HttpComponents客户端HttpRequestFactory requestFactory=新的HttpComponents客户端HttpRequestFactory();
setReadTimeout(读取超时);
setConnectTimeout(连接超时);
返回新的RestTemplate(requestFactory);
}
公共字符串getData(){
Future=executor.submit(新任务(restTemplate));
字符串响应=null;
试一试{
response=future.get(500,TimeUnit.ms);
}捕获(超时异常e){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
返回响应;
}
}
SimpleClientHttpRequestFactory使用标准JDK的HTTP库,因此不支持HttpMethod.PATCH等方法。因此,最好现在就使用httpcomponents客户端httprequestfactory
,而不是以后在必要时更改它。谢谢您的建议。你知道我们打算用哪一种吗?或者我们可以用这两个中的任何一个?以及如何在我的上述代码库中有效地使用requestFactory
?我从您的示例中了解如何使用它,但由于我使用DI传递RestTemplate,因此我在上述代码库中的requestFactory
位置如何。这取决于您,但就个人而言,在我们的大型项目中,我们使用了HttpComponents客户端HttpRequestFactory。但我想这两种方法都不会有任何问题。使用httpcomponents客户端httprequestfactory
可以使用自己的HttpClient
配置更多选项。要在代码库中使用,只需传递HttpComponentsClientHttpRequestFactory
实例,就像我在回答结束时编写的代码一样。当然,我正在考虑使用HttpComponentsClientHttpRequestFactory
。我不明白你想让我通过哪一关?如果您能在我的代码基础上提供一个示例,那么我会更好地理解您的意思?请查看更新的答案,您需要创建一个restemplate
的单例共享实例,因为它是线程安全的,而且很重。附言:我还没有测试代码。谢谢你的编辑。现在我明白你刚才的意思了。最后一个问题,这里的读取超时
与连接超时
有什么区别?
public class TimeoutThreadExample {
private ExecutorService executor = Executors.newFixedThreadPool(10);
private static final RestTemplate restTemplate = createRestTemplate();
private static RestTemplate createRestTemplate(){
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(READ_TIME_OUT);
requestFactory.setConnectTimeout(CONNECTION_TIME_OUT);
return new RestTemplate(requestFactory);
}
public String getData() {
Future<String> future = executor.submit(new Task(restTemplate));
String response = null;
try {
response = future.get(500, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return response;
}
}