Я работаю над проектом, в котором мне нужно сделать HTTP-URL-адрес на моем сервере, который работает Restful Service
, который возвращает ответ как строку JSON.
Ниже мой основной код, который использует 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
class 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, то я вижу лучшую производительность до конца по сравнению с нестационарной RestTemplate
после комментирования строки line1 и line2 в классе DemoTest
, которая измеряет производительность.
Как правильно использовать RestTemplate
в среде многопоточности? В настоящее время я вызываю последовательно getData
метод 5000 раз один за другим, но некоторый клиент будет вызывать его многопоточным способом, поэтому вам нужно знать, что является лучшим способом иметь RestTemplate в многопоточной среде.
Может быть, использовать ConnectionFactory в конструкторе RestTemplate? Любые мысли?
UPDATE: -
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;
}
}