gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:48:57 25 4
gpt4 key购买 nike

我需要每天在 playframework2.0.4 中执行一段代码 1 次,当我尝试使用类扩展 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());
}
});
}
}

这是我的 Controller ,开始上面的类(class)

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 毫秒安排一次。

对于第二个任务,您需要使用通用日期/时间类计算当前 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;
}
}

关于java - 如何在 Play 2.0.4 中每天安排任务 + onStart()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14706300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com