gpt4 book ai didi

java - 如何在多线程环境下高效使用 RestTemplate?

转载 作者:太空狗 更新时间:2023-10-29 22:39:47 31 4
gpt4 key购买 nike

我正在开发一个项目,我需要对运行 Restful Service 的服务器进行 HTTP URL 调用,该服务器将响应作为 JSON 字符串返回。

下面是我的主要代码,它使用了 futurecallables -

public class TimeoutThreadExample {

private ExecutorService executor = Executors.newFixedThreadPool(10);

public String getData() {
Future<String> future = executor.submit(new Task());
String response = null;

try {
response = future.get(100, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

return response;
}
}

下面是我的 Task 类,它实现了 Callable 接口(interface)并使用了 RestTemplate...

class Task implements Callable<String> {

private RestTemplate restTemplate = new RestTemplate();

public String call() throws Exception {

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

return response;
}
}

现在我在另一个类 DemoTest 中有以下代码,它调用 TimeoutThreadExample 类中的 getData 方法 5000 次 按顺序 -

public class DemoTest { 
public static void main(String[] args) {

TimeoutThreadExample bc = new TimeoutThreadExample();

for (int i = 0; i <= 5000; i++) {
// TimerTest timer = TimerTest.getInstance(); // line 1
bc.getData();
// timer.getDuration(); // line 2
}
}
}

所以我的问题是 RestTemplate 是否应该在我的 Task class 中保持静态,就好像我没看错一样,我正在为 中的每个请求重新创建整个连接池>RestTemplate 我猜这不是正确的方式..

注意:如果我将 RestTemplate 设为静态,那么在注释掉 中的第 1 行和第 2 行之后,与非静态 RestTemplate 相比,我看到端到端的性能更好衡量性能的 DemoTest 类。

一般来说,在多线程环境中使用 RestTemplate 的正确方法是什么?目前,我正在一个接一个地顺序调用 getData 方法 5000 次,但有些客户会以多线程方式调用它,因此需要知道在多线程环境中使用 RestTemplate 的最佳方式是什么。

可能是在 RestTemplate 构造函数中使用 ConnectionFactory?有什么想法吗?

更新:-

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(100, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

return response;
}
}

在我的 TaskClass 下方 -

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

最佳答案

如果我不明白你的问题,请纠正我。和上一个好像很像here .

在那里,我们确定 RestTemplate 是线程安全的。因此,没有理由不在任何有意义的地方分享它,即。无论您在哪里以相同的方式使用它。您的示例似乎是这样做的完美场所。

正如您所说,为每个 Task 实例重新创建一个新的 RestTemplate 实例是一种浪费。

我会在 TimeoutThreadExample 中创建 RestTemplate 并将其作为构造函数参数传递给 Task

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

通过这种方式,您可以在所有 Task 对象之间共享 RestTemplate 实例。

请注意,RestTemplate 使用 SimpleClientHttpRequestFactory 来创建其连接。

关于java - 如何在多线程环境下高效使用 RestTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242812/

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