Java ScheduledFuture执行异步任务,直到完成

时间:2018-10-23 14:48:27

标签: java concurrency javamail scheduling scheduledexecutorservice

为了以固定的速率异步发送大型电子邮件,我使用的是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;
            }
        }
    }

}

感谢一些有用的建议!

2 个答案:

答案 0 :(得分:0)

收集在计划好收集后返回的所有期货,然后收集foreach get()。

答案 1 :(得分:0)

sf.isCancelled()怎么样?不是您要找的东西吗?