为了以固定的速率异步发送大型电子邮件,我使用的是ScheduledExecutorService
。
我有一个实现Runnable
的类,该类异步发送邮件。需要每秒调用一次,并且精确地调用x次。对于实际发送,我使用Simple Java Mail。我叫的方法是EmailBuilder#send(mail, /* boolean async */ true)
。
一旦该方法被调用了x次,就会调用ScheduledExecutorService#shutdown()
。
我想要的是能够确定所有计划的Runnable在哪个时间点终止,即所有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;
}
}
}
}
感谢一些有用的建议!
答案 0 :(得分:0)
收集在计划好收集后返回的所有期货,然后收集foreach get()。
答案 1 :(得分:0)
sf.isCancelled()怎么样?不是您要找的东西吗?