Java SimpleClientHttpRequestFactory与HttpComponentHttpRequestFactory对RestTemplate的Http请求超时?

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

我正在从事一个项目,在这个项目中,我需要对运行Restful服务的服务器进行HTTP URL调用,该服务将响应作为
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请求超时值是否应该小于将来的超时值

  • httpcomponents客户端httprequestfactory
    vs
    SimpleClientHttpRequestFactory
    。用哪一个
  • 我的Http请求超时值是否应小于将来的超时值

默认情况下,RestTemplate使用
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;
    }
}