Я пытаюсь запросить базу данных со списком идентификаторов сообщений, чтобы получить обратно метаданные сообщения и объединить результат в карту. В базе данных есть ограничения относительно скорости чтения и пропускной способности, поэтому я планирую выполнять чтение с фиксированной задержкой в одну секунду. Ниже приведена реализация, которую я сделал.
Проблема с реализацией:
- Запросы отправляются последовательно, и один запрос может занять много времени. Так что задержка действительно становится (время запроса + 1с сон). Но я бы начал второй запрос через секунду сразу после отправки первого запроса.
- Когда выдается несколько исключений, я хотел бы перезапустить его и позволить вызывающему методу обработать исключение. Текущая реализация вынуждает меня перехватить исключение и обработать его внутри карты.
Хотелось бы получить рекомендацию по реализации, у которой нет двух указанных выше проблем
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;
}
}