加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – SimpleClientHttpRequestFactory vs HttpComponentsClie

发布时间:2020-12-14 06:01:23 所属栏目:Java 来源:网络整理
导读:我正在开发一个项目,我需要对我的服务器进行HTTP URL调用,该服务器正在运行Restful Service,它将响应作为 JSON字符串返回. 下面是我使用未来和callables的主要代码: public class TimeoutThreadExample { private ExecutorService executor = Executors.new
我正在开发一个项目,我需要对我的服务器进行HTTP URL调用,该服务器正在运行Restful Service,它将响应作为 JSON字符串返回.

下面是我使用未来和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;
    }
}

下面是我的Task类,它实现Callable接口并使用RestTemplate:

class Task implements Callable<String> {

    private RestTemplate restTemplate;

    public Task(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String call() throws Exception {

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

        return response;
    }
}

问题陈述:

正如您在上面所看到的,我使用RestTemplate执行URL的默认方式,它不使用任何Http Request超时,因此这意味着它在内部使用-1作为读取和连接超时.

现在我要做的是,我想在上面的代码中有效地使用RestTemplate设置Http Request超时.而且我不确定我需要使用哪个类,我可以看到HttpComponentsClientHttpRequestFactory和SimpleClientHttpRequestFactory所以不确定我需要使用哪一个?

我上面的代码的任何简单的示例基础将帮助我更好地理解如何使用RestTemplate设置Http请求超时.

我的Http Request超时值是否应该小于未来的超时值?

> HttpComponentsClientHttpRequestFactory vs SimpleClientHttpRequestFactory.哪一个使用?
>我的Http Request超时值是否应该小于未来的超时值?

解决方法

默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,它依赖于HttpURLConnection的默认配置.

您可以使用以下属性配置它们:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec

如果你想使用HttpComponentsClientHttpRequestFactory – 它有一个SimpleClientHttpRequestFactory没有的连接池配置.

使用HttpComponentsClientHttpRequestFactory的示例代码:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读