Для асинхронной отправки больших писем с фиксированной скоростью я использую 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;
}
}
}
}
Спасибо за полезные советы!