Будущее и сбор данных по мере их завершения - PullRequest
0 голосов
/ 21 июня 2019

Помогите пожалуйста разобраться. Я отправляю запрос в базу данных и получаю время выполнения запроса.

Ниже приведен метод в контроллере, в котором в теле запроса я передаю запрос. Я создаю пул из 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 и не смогу отправить запрос снова?

Спасибо!

...