如何在Play 2.0.4中每天安排任务+ onStart()?

我需要每天在playframework2.0.4中执行一段代码,当我尝试使用类扩展GlobalSettings时它可以工作。 但它适用于每个请求的实例。 我希望它在服务器启动时起作用并且每天执行一次任务。

package controllers; import java.util.concurrent.TimeUnit; import akka.util.Duration; import play.Application; import play.GlobalSettings; import play.libs.Akka; public class ParserJobApp extends GlobalSettings{ @Override public void onStart(Application app) { Akka.system().scheduler().schedule(Duration.create(0, TimeUnit.MILLISECONDS),Duration.create(6, TimeUnit.SECONDS), new Runnable() { @Override public void run() { System.out.println("AAA --- "+System.currentTimeMillis()); } }); } } 

这是我的控制器开始上面的课程

 public class Application extends Controller { public static Result index() { ParserJobApp pr=new ParserJobApp(); pr.onStart(null); System.out.println("sfsdfsdf"); return ok(index.render("Your new ")); } } 

调度程序任务应仅放在Global类中。 创建两个任务,首先使用initialDelay = 0毫秒计划一次。

对于第二个任务,您需要使用常用日期/时间类计算当前DateTime和下一个计划发生之间的秒数(即明天8:00),然后将此差异设置为initialDelay并将frequency设置为24小时。

结果,它将在应用程序启动时开始,并将在每个所需的时间安排执行任务。

编辑

有完整的示例,(保存/编辑类: /app/Global.java ):

 import akka.util.Duration; import org.joda.time.DateTime; import org.joda.time.Seconds; import play.Application; import play.GlobalSettings; import play.Logger; import play.libs.Akka; import java.util.concurrent.TimeUnit; public class Global extends GlobalSettings { @Override public void onStart(Application application) { Akka.system().scheduler().scheduleOnce( Duration.create(0, TimeUnit.MILLISECONDS), new Runnable() { @Override public void run() { Logger.info("ON START --- " + System.currentTimeMillis()); } } ); Akka.system().scheduler().schedule( Duration.create(nextExecutionInSeconds(8, 0), TimeUnit.SECONDS), Duration.create(24, TimeUnit.HOURS), new Runnable() { @Override public void run() { Logger.info("EVERY DAY AT 8:00 --- " + System.currentTimeMillis()); } } ); } public static int nextExecutionInSeconds(int hour, int minute){ return Seconds.secondsBetween( new DateTime(), nextExecution(hour, minute) ).getSeconds(); } public static DateTime nextExecution(int hour, int minute){ DateTime next = new DateTime() .withHourOfDay(hour) .withMinuteOfHour(minute) .withSecondOfMinute(0) .withMillisOfSecond(0); return (next.isBeforeNow()) ? next.plusHours(24) : next; } } 

这是我的解决方案,它更轻,支持用于调度的cron表达式。 在此示例中,调度程序将在每天上午10:00运行。

在您的Global课程中关注:

 private Cancellable scheduler; @Override public void onStart(Application application) { super.onStart(application); schedule(); } @Override public void onStop(Application application) { //Stop the scheduler if (scheduler != null) { scheduler.cancel(); } } private void schedule() { try { CronExpression e = new CronExpression("0 00 10 ? * *"); Date nextValidTimeAfter = e.getNextValidTimeAfter(new Date()); FiniteDuration d = Duration.create( nextValidTimeAfter.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS); Logger.debug("Scheduling to run at "+nextValidTimeAfter); scheduler = Akka.system().scheduler().scheduleOnce(d, new Runnable() { @Override public void run() { Logger.debug("Ruuning scheduler"); //Do your tasks here schedule(); //Schedule for next time } }, Akka.system().dispatcher()); } catch (Exception e) { Logger.error("", e); } } 

这可以使用Global Class完成,并且可以使用onstart方法。 https://www.playframework.com/documentation/2.5.x/JavaGlobal

下面的代码以10分钟间隔打印JVM统计数据。 可以配置持续时间以满足需要。

下面给出编码的抽象视图。 希望这有帮助

 public class Global extends GlobalSettings { private Cancellable scheduler; @Override public void onStart(Application application) { int timeDelayFromAppStartToLogFirstLogInMs = 0; int timeGapBetweenMemoryLogsInMinutes = 10; scheduler = Akka.system().scheduler().schedule(Duration.create(timeDelayFromAppStartToLogFirstLogInMs, TimeUnit.MILLISECONDS), Duration.create(timeGapBetweenMemoryLogsInMinutes, TimeUnit.MINUTES), new Runnable() { @Override public void run() { System.out.println("Cron Job"); // Call a function (to print JVM stats) } }, Akka.system().dispatcher()); super.onStart(application); } @Override public void onStop(Application app) { scheduler.cancel(); super.onStop(app); } }