【问题标题】:Play Framework - Schedule a task at precise time [duplicate]Play Framework - 在精确的时间安排任务[重复]
【发布时间】:2016-07-07 09:02:33
【问题描述】:

我正在做一个 Scala - Play 应用程序,我想安排一个任务在每天凌晨 3 点发送邮件,所以我为此创建了一个类,但我不工作:

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

我不太明白这两行有什么用

【问题讨论】:

  • 您可以使用 java 调度程序或石英。 Quartz 更可取,因为它为此提供了漂亮而简单的 API。
  • @TheArchetypalPaul 该答案的链接指向 Play 1.x 文档。这也适用于 Play 2.x?
  • 不知道,抱歉。我只记得昨天看到了链接的问题

标签: scala playframework akka


【解决方案1】:

这不会像你期望的那样工作。 Akka 调度程序只允许您指定任务的重复性,但不能指定运行的日期、时间等(例如:您可以告诉它每 10 分钟运行一次任务,但不能在每周一的 15:30 运行)。

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

要克服这个问题,您只需要定期运行任务(在您的情况下,例如每分钟),并检查当前时间。如果是凌晨 3 点,请发送这些电子邮件(并最终存储该任务是否已执行)。

另一种选择是使用 akka-quartz-scheduler 之类的东西,它可以让您指定该类型的调度

【讨论】:

  • 玩!对此有支持。查看我链接到的建议副本
  • @Clement.Cvl 尝试在构造函数中注入system: ActorSystem,然后作为system.scheduler.schedule使用
  • 如何使用 akka-quartz-scheduler 调整我的代码?你有什么看起来像我的例子吗?
  • @Clement.Cvl 不,抱歉。该 GitHub 存储库中有一个名为“Every30Seconds”的示例,可能会对您有所帮助
【解决方案2】:

我遇到了同样的问题。所以我创建了一个方法来计算从现在到我想要运行我的时间的时间

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

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 2011-10-11
    • 1970-01-01
    • 2020-10-26
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2018-06-20
    相关资源
    最近更新 更多