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), 

我真的不明白它的使用这两条线

+0

您可以使用java调度程序或石英。石英是最好的,因为它提供了很好和简单的API。 – Abhi

+0

@TheArchetypalPaul该答案的链接指向Play 1.x文档。这也可以与Play 2.x一起使用? – Salem

+0

不知道,对不起。我只记得昨天看到链接的问题 –

,你想到的是行不通的。 Akka调度程序只是让你指定任务的重复性,但不会在运行时间(例如:你可以告诉它每隔10分钟运行一次任务,但不能在每周一的15:30运行)。

这两行指示Akka每60秒运行一次该任务,并在您定义它之后的第一次20秒后运行(因此如果在12h30m执行schedule调用,该任务将在12:30第一次运行: 20,然后12:31:20,12:32:20等)。

为了解决这个问题,你只需要定期运行一个任务(例如你的情况,例如每分钟),然后检查当前的小时。如果这是3AM发送这些电子邮件(并最终存储任何执行此任务)。

另一种选择是使用类似akka-quartz-scheduler,让您指定类型的调度

+0

玩!对此有支持。看到建议的重复我链接到 –

+0

@ Clement.Cvl尝试在构造函数中注入'system:ActorSystem',然后将其用作'system.scheduler.schedule' – Salem

+0

如何使用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; 
}