Java 如何安排每天的任务+;游戏2.0.4中的onStart()?
我需要每天在playframework2.0.4中执行一段代码1次,当我尝试使用它工作的类extends GlobalSettings时。但它适用于每个请求的实例。我希望它的工作时,服务器启动,并履行其职责,每天1次Java 如何安排每天的任务+;游戏2.0.4中的onStart()?,java,playframework-2.0,akka,scheduler,Java,Playframework 2.0,Akka,Scheduler,我需要每天在playframework2.0.4中执行一段代码1次,当我尝试使用它工作的类extends GlobalSettings时。但它适用于每个请求的实例。我希望它的工作时,服务器启动,并履行其职责,每天1次 package controllers; import java.util.concurrent.TimeUnit; import akka.util.Duration; import play.Application; import play.GlobalSettings; im
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 "));
}
}
调度程序任务应仅放置在全局类中。创建两个任务,首先只计划一次,且
initialDelay
=0毫秒
对于第二个任务,您需要使用通用日期/时间类计算当前日期时间和下一个计划事件(即明天8:00)之间的秒数,然后将此差值设置为initialDelay
,并将频率设置为24小时
因此,它将在应用程序启动时启动,并将安排每天在所需时间执行任务
编辑
有完整的示例,(保存/编辑类:/app/Global.java
):
这是我的解决方案,它更轻,并且支持用于调度的cron表达式。在本例中,计划程序将在每天上午10:00运行
在您的全球课程中:
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);
}
}
这可以使用全局类来完成,而不是使用onstart方法
下面的代码每隔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);
}
}
每次我打电话,这项任务又开始工作了。因此,这意味着当每个用户都提出请求时,它将起作用。无法在应用程序启动时启动任务1吗?我在index()方法的controller类中创建了Global类的实例,即Global gl=new Global();总账启动(空);我给了您整个全局类,只需将其保存为/app/Global.java
,并且不在您的操作中创建任何实例,但我想问一些其他问题。当我停止应用程序时,第二个任务(计划)再次像[info]play-Shutdown应用程序默认的Akka系统一样工作。[信息]应用程序-每天8:00--1360074567517这正常吗?我在回答后也意识到:有一条评论:“它必须在.close()上执行所有未完成的任务,以便正确关闭所有调度程序。”这可能会导致最后一次执行。如果您找不到任何解决方案,这是新问题的好话题(我对此很感兴趣,但现在没有时间)好的,我就是这样做的:Cancelable scheduler=Akka.system().scheduler().schedule(…);和create:@Override public void onStop(Application Application){scheduler.cancel();}这个版本的schedule()似乎已经在2.1中被删除了,你如何在play 2.1中做到这一点呢?不管怎样,我刚刚找到了它。现在需要4个参数,最后一个是执行上下文Akka.system().dispatcher()。谢谢,您的解决方案非常好。但您的代码需要添加Tyrael的解决方案,以便在应用程序停止时取消调度程序;内部桌面功能?
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);
}
}