Java ScheduledFuture, выполняющая асинхронную задачу, ждет, пока не завершится - PullRequest
0 голосов
/ 23 октября 2018

Для асинхронной отправки больших писем с фиксированной скоростью я использую ScheduledExecutorService.

У меня есть класс, реализующий Runnable, который асинхронно отправляет почту.Его нужно вызывать каждую секунду и ровно x раз.Для фактической отправки я использую Simple Java Mail .Метод, который я вызываю: EmailBuilder#send(mail, /* boolean async */ true).

Как только этот метод был вызван в те x раз, вызывается ScheduledExecutorService#shutdown().

Я хотел бы определить, в какой моментсо временем все запланированные Runnables были прерваны, то есть все вызовы EmailBuilder#send(mail, /* boolean async */ true) вернулись.

Я попытался ScheduledExecutorService#awaitTermination() с некоторым таймаутом, а также ScheduledFuture#get(), но это не сработало или возникло исключение.

package playground;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.simplejavamail.email.Email;
import org.simplejavamail.email.EmailBuilder;
import org.simplejavamail.mailer.Mailer;
import org.simplejavamail.mailer.MailerBuilder;

public class MCVE {

    private ScheduledExecutorService scheduler;
    private SendTask sd;
    private ScheduledFuture<?> sf;
    private boolean terminateFlag = false;

    public void start() {
        sd = new SendTask();
        scheduler = Executors.newSingleThreadScheduledExecutor();
        sf = scheduler.scheduleAtFixedRate(sd, 0, 1, TimeUnit.SECONDS);
    }

    private class SendTask implements Runnable {

        @Override
        public void run() {
            Mailer mailer = MailerBuilder.withSMTPServer("smtp.gogglemail.com", 587).buildMailer();

            Email mail = EmailBuilder.startingBlank()
                .from("from@gmail.com")
                .to("to@gmail.com")
                .withSubject("Subject")
                .withPlainText("Content")
                .buildEmail();

            mailer.sendMail(mail, /* async */ true);

            if (terminateFlag) {
                sf.cancel(true);
                scheduler.shutdown();
                return;
            }
        }
    }

}

Спасибо за полезные советы!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

А как насчет sf.isCancelled ()?Это не то, что вы ищете?

0 голосов
/ 23 октября 2018

Соберите все фьючерсы, возвращенные после планирования в коллекции, и затем foreach get ().

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