当前位置: 首页 > 面试题库 >

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

章安易
2023-03-14
问题内容

当我尝试使用类扩展GlobalSettings时,我需要每天在playframework2.0.4中执行一次代码。但是它适用于每个实例请求。我希望它在服务器启动时能正常工作,并且每天要执行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 "));

}
}

问题答案:

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

对于第二项任务,您需要使用通用的日期/时间类来计算当前日期时间与下一个计划的发生时间(即明天的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;
    }
}


 类似资料:
  • 我在Tomcat中部署了一个web应用程序。我有一套代码,它检查数据库中的某些数据,然后根据这些数据向用户发送邮件。有人能建议如何在Tomcat中安排这项工作吗。

  • 问题内容: 我需要安排任务以固定的时间间隔运行。如何在长间隔(例如每8个小时)的支持下执行此操作? 我目前正在使用。是否支持长时间间隔? 问题答案: 使用:

  • 问题内容: 我编写了一个Java程序,该程序使用Google Analytic API检索到目前为止的Google数据并将其导出为CSV文件。我希望该程序每天运行,以便CSV文件中的数据是最新的。我该如何实现? 问题答案: 您可以使用Windows Task Scheduler(请参阅教程)来启动任何程序。对于Java,您可能需要创建一个批处理文件来运行Java程序,然后使用Scheduler运行

  • 问题内容: 如何每天在指定时间(例如上午11:00)使用运行任务?我正在使用JDK 1.4.2,我知道它很旧,但这是项目所需要的。 问题答案: Quartz是在Java环境中调度进程的最著名的解决方案,但是您有很多选择。检查此列表: Quartz 是一个开源作业调度系统,可以与几乎任何J2EE或J2SE应用程序集成或一起使用。Quartz可用于创建简单或复杂的时间表。 Jcrontab 旨在扩展并

  • 问题内容: 我的Java Scheduler有一个问题,我的实际需要是我必须在特定时间启动我的进程,并且我将在特定时间停止,我可以在特定时间启动我的进程,但是我不能在特定时间停止我的进程,如何指定进程在调度程序中运行多长时间(在这里我不会放),任何人对此都有建议。 问题答案: 您可以使用带有2个计划的计划,一个计划运行任务,另一个计划终止任务-参见下面的简化示例:

  • 问题内容: 我正在使用类,并且正在使用其schedule方法执行某些任务,但是在执行了6次之后,我必须停止其任务。 我该怎么办? 问题答案: 在某个地方保留对计时器的引用,并使用: 停止所做的一切。您可以将此代码放在要执行的任务中,static int以计算您经过的次数,例如