问题描述
我正在编写一个bulkmailer应用程序,该应用程序将一个接一个地发送多封邮件。
for(MailRecieversDTO individualObject: dto) {
bulkMailSender.sendSimpleMessage(individualObject);
try {
TimeUnit.MINUTES.sleep(5);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
有sendSimpleMessage()
方法将发送消息。我想每隔5分钟发送一次电子邮件。
为此,我使用了TimeUnit.MINUTES.sleep(5);
。
在这种情况下,它工作正常,因为我将此处的时间直接配置为5分钟。现在,我需要从客户端屏幕(角度)发送sleep()方法的时间。
对于发送批量邮件的第一个请求,它将在规定的时间内正常工作。如果第二个呼叫以不同的时间发送另一封大容量邮件,则新邮件将更改时间。
public void sendMail(int time,dto){
for(MailRecieversDTO individualObject: dto) {
bulkMailSender.sendSimpleMessage(individualObject);
try {
TimeUnit.MINUTES.sleep(time);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
}
我的问题是我想从客户端那里抽出时间来发送带有前端提供的时间间隔的邮件。如果第二个请求开始发送另一封邮件,则第一个线程将以提供的第一个时间间隔继续执行第一封邮件,第二个线程也以提供的第二个时间继续执行。
我可以用TimeUnit.MINUTES.sleep(time);
来实现还是有其他替代方法。
解决方法
ScheduledExecutorService类更适合您的目的。它需要执行一项任务,并按计划的时间间隔为您重复执行,因此您不必担心异常处理。如果要更改时间间隔,只需停止正在运行的服务,然后使用新的时间间隔重新安排它。
如果您喜欢冒险,还可以检查MgntUtils开源库(由我编写)中包含的备用后台任务运行程序。这是link的解释说明。该库本身可以作为Maven artifact或Github repository找到。还要注意,如果您查看源代码(在Github存储库中),则包com.mgnt.lifecycle.management.backgroundrunner.example
包含完整的用法示例