Как отправить запросы в базу данных с фиксированной задержкой - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь запросить базу данных со списком идентификаторов сообщений, чтобы получить обратно метаданные сообщения и объединить результат в карту. В базе данных есть ограничения относительно скорости чтения и пропускной способности, поэтому я планирую выполнять чтение с фиксированной задержкой в ​​одну секунду. Ниже приведена реализация, которую я сделал.

Проблема с реализацией:

  1. Запросы отправляются последовательно, и один запрос может занять много времени. Так что задержка действительно становится (время запроса + 1с сон). Но я бы начал второй запрос через секунду сразу после отправки первого запроса.
  2. Когда выдается несколько исключений, я хотел бы перезапустить его и позволить вызывающему методу обработать исключение. Текущая реализация вынуждает меня перехватить исключение и обработать его внутри карты.

Хотелось бы получить рекомендацию по реализации, у которой нет двух указанных выше проблем

public PollingResult pollMessagesMeta(final List<Long> messageIdList) throws InterruptedException {
    Map<MessageMeta, Integer> messageMetaCountMap = new HashMap<>();

    Map<MessageMeta, Integer>result =
            messageIdList.stream().map(messageId -> new MessageMetaFetcher(messageId))
                    .map(MessageMetaFetcher -> {
                        try {
                            return MessageMetaFetcher.call();
                        } catch (ServiceException e) {
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        return null;
                    })
                    .collect(Collectors.groupingBy(Function.identity(), reducing(0, e -> 1, Integer::sum)));
}


    private class MessageMetaFetcher {
        private final Long messageId;
        MessageMetaFetcher(Long messageId) {
            this.messageId = messageId;
        }

        public MessageMeta call() throws ServiceException, InterruptedException {
            Thread.sleep(1000);
            final MessageMeta messageMeta = new MessageMeta(
                    Database.getMessageStatus(messageId),
                    Database.getMessageContent(messageId));
            return messageMeta;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...