如何在多线程环境中有效地使用 RestTemplate?
我正在处理一个项目,其中我需要对正在运行的服务器进行HTTP URL调用,该服务器将响应作为JSON字符串返回。Restful Service
下面是我的主要代码,它使用和future
callables
-
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
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
getData
TimeoutThreadExample
5000 times
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
一般来说,在多线程环境中使用的正确方法是什么?目前,我正在逐个按顺序调用方法 5000 次,但有些客户会以多线程方式调用它,因此需要知道在多线程环境中使用 RestTemplate 的最佳方式是什么。RestTemplate
getData
可能是在 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;
}
}