Помогите пожалуйста разобраться. Я отправляю запрос в базу данных и получаю время выполнения запроса.
Ниже приведен метод в контроллере, в котором в теле запроса я передаю запрос. Я создаю пул из 3 потоков, в executor я вызываю 3 метода, которые отправляют этот запрос на 3 разные базы, и обертывают все это в Future<Map<String, Object>>
Затем с помощью future.get () я буду ждать, пока не получу результат от все 3 потока и вернуть его в виде карты.
Я проверяю через Почтальона: когда я отправляю запрос, пора ждать запроса, например, в течение 3 секунд, и я получаю результат.
Вопрос ставится следующим образом:
1) необходимо параллельно (одновременно) отправить запрос на 3 базы
2) Необходимо запретить повторную отправку запроса до тех пор, пока результат не будет получен из всех трех потоков, а не из одного:
например (первый поток свободен, второй и третий заняты, и мы можем еще раз выполнить наш запрос к базе)
@PostMapping(value = "/select/")
public Map<String, Object> callSelectQuery(@RequestBody SelectQuery query) throws InterruptedException, TimeoutException, ExecutionException {
List<Map<String, Object>> list = new ArrayList<>();
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<Map<String, Object>> future = executor.submit(() -> {
Map<String, Object> mapMySql = mySqlService.select(query);
Map<String, Object> mapPostgreSQL = postgreSqlService.select(query);
Map<String, Object> mapH2DB = h2Service.select(query);
list.add(mapMySql);
list.add(mapPostgreSQL);
list.add(mapH2DB);
return list;
});
System.out.println("Future is done? " + future.isDone());
Map<String, Object> result = future.get(5, TimeUnit.SECONDS);
System.out.println("Future is done? " + future.isDone());
System.out.println("result: " + result);
executor.shutdown();
return result;
}
Это один из 3 методов запроса к базе данных (я получаю время выполнения):
public Map<String, Object> select(SelectQuery query) {
Map<String, Object> map = new HashMap();
try {
final Stopwatch sw = Stopwatch.createStarted();
mysqlTemplate.queryForList(String.valueOf(query));
sw.stop();
long executionTime = sw.elapsed(TimeUnit.MILLISECONDS);
map.put("MySQL execution time: ", executionTime + " ms");
} catch (EmptyResultDataAccessException e) {
logger.error("Error select data: " + e.getMessage(), e);
}
return map;
}
Скажите, эта функция написана правильно? Действительно ли я жду их выполнения во время выполнения 3 методов и только когда все 3 запроса готовы, получу ли я результат Future и не смогу отправить запрос снова?
Спасибо!