Play Framework - 精确时间安排任务
我正在做一个Scala - Play应用程序,并且我想安排一项任务在每天凌晨3点发送邮件,所以我为此创建了一个类,但我不工作:Play Framework - 精确时间安排任务
class ManageSendInvalidateDaemon @Inject() (app: Application, emailSender: EmailSender, mailer: MailerClient) {
Akka.system(app).scheduler.schedule(
scala.concurrent.duration.Duration.create(20,TimeUnit.SECONDS),
scala.concurrent.duration.Duration.create(60, TimeUnit.SECONDS),
new Runnable(){
override def run()={
//Function to send the mail
}
}
);
};
我认为这个问题是在这里:
scala.concurrent.duration.Duration.create(20,TimeUnit.SECONDS),
scala.concurrent.duration.Duration.create(60, TimeUnit.SECONDS),
我真的不明白它的使用这两条线
,你想到的是行不通的。 Akka调度程序只是让你指定任务的重复性,但不会在运行时间(例如:你可以告诉它每隔10分钟运行一次任务,但不能在每周一的15:30运行)。
这两行指示Akka每60秒运行一次该任务,并在您定义它之后的第一次20秒后运行(因此如果在12h30m执行schedule
调用,该任务将在12:30第一次运行: 20,然后12:31:20,12:32:20等)。
为了解决这个问题,你只需要定期运行一个任务(例如你的情况,例如每分钟),然后检查当前的小时。如果这是3AM发送这些电子邮件(并最终存储任何执行此任务)。
另一种选择是使用类似akka-quartz-scheduler,让您指定类型的调度
玩!对此有支持。看到建议的重复我链接到 –
@ Clement.Cvl尝试在构造函数中注入'system:ActorSystem',然后将其用作'system.scheduler.schedule' – Salem
如何使用akka-quartz-scheduler调整我的代码?你有没有看起来像我的情况的例子? –
的我有同样的问题。所以,我创建了一个方法,从现在开始计算多少时间,直到我要运行我的
schedule = Akka.system().scheduler().schedule(
Duration.create(nextRunTime(), TimeUnit.MILLISECONDS),
Duration.create(DAY_IN_MS, TimeUnit.MILLISECONDS),
...,);
的nextRunTime()方法计算多少时间以毫秒为单位将直到下一次凌晨3点之后,我设置的时间间隔一天(DAY_IN_MS)
private int nextRunTime() {
String runTimeValue = "03:00";
LocalTime now = new LocalTime();
LocalTime runTime = new LocalTime(runTimeValue);
int timeUntilRun;
if (runTime.isAfter(now)) { // From now until the run time
timeUntilRun = runTime.getMillisOfDay() - now.getMillisOfDay();
} else { // From now until midnight, plus from midnight until the run time
timeUntilRun = DAY_IN_MS - now.getMillisOfDay() + runTime.getMillisOfDay();
}
Logger.info("nextRunTime(): next run in " + timeUntilRun + " ms");
return timeUntilRun;
}
您可以使用java调度程序或石英。石英是最好的,因为它提供了很好和简单的API。 – Abhi
@TheArchetypalPaul该答案的链接指向Play 1.x文档。这也可以与Play 2.x一起使用? – Salem
不知道,对不起。我只记得昨天看到链接的问题 –