2016-07-07 47 views
2

我正在做一個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

不知道,對不起。我只記得昨天看到鏈接的問題 –

回答

3

,你想到的是行不通的。 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調整我的代碼?你有沒有看起來像我的情況的例子? –

0

的我有同樣的問題。所以,我創建了一個方法,從現在開始計算多少時間,直到我要運行我的

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; 
}