Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何安排每天的任务+;游戏2.0.4中的onStart()?_Java_Playframework 2.0_Akka_Scheduler - Fatal编程技术网

Java 如何安排每天的任务+;游戏2.0.4中的onStart()?

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

我需要每天在playframework2.0.4中执行一段代码1次,当我尝试使用它工作的类extends GlobalSettings时。但它适用于每个请求的实例。我希望它的工作时,服务器启动,并履行其职责,每天1次

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

}