Как запустить список фьючерсов одновременно? - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь использовать AmazonSimpleEmailServiceAsyn c .sendEmailAsyn c для одновременной отправки пакетов электронной почты, но по какой-то причине я действительно пытаюсь найти правильный способ сделать это.

Выполняя цикл по списку получателей, я создаю фьючерсы примерно так ...

val recipientEmailAddress = it.emailAddress

val result: Future<SendEmailResult> = client.sendEmailAsync(SendEmailRequest()
                                            .withMessage(message)
                                            .withDestination(Destination()
                                                    .withToAddresses(recipientEmailAddress))
                                            .withSource("sender@mydomain.com")
                                    , object: com.amazonaws.handlers.AsyncHandler<SendEmailRequest,SendEmailResult> {
                                        override fun onError(e: Exception?) {
                                            LOG.error("Error sending email.", e)
                                            failedList.add(it)
                                        }

                                        override fun onSuccess(request: SendEmailRequest, result: SendEmailResult?) {
                                            LOG.debug("Successfully sent email $recipientEmailAddress")
                                            successList.add(it)
                                        }
                                    });

futureList.add(result);

Затем я могу запустить их, выполнив следующее ...

val resultList = futureList.map { it.get() }

Проблема в том, что при этом вызовы не выполняются одновременно, каждый вызов it.get () блокируется до тех пор, пока не будет получен результат, то есть все они выполняются последовательно, что сводит на нет преимущества использования sendEmailAsyn c.

Как правильно это сделать?

Я просто хочу сделать следующее:

  1. Вызвать sendEmailAsyn c для каждого получателя
  2. Выполнить все одновременные вызовы
  3. Подождите, пока все завершится

Не думаю, что мне нужно (или нужно) использовать несколько потоков. Мне не нужна параллельная обработка, я просто хочу, чтобы вызовы в Amazon SES происходили одновременно.

Это тривиально в C# et c. но я не могу понять, как это сделать с Kotlin / Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...