16

クラス extends GlobalSettings を操作しようとすると、playframework2.0.4 で毎日 1 回コードを実行する必要があります。ただし、リクエストするすべてのインスタンスで機能します。サーバーの起動時に機能し、毎日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 "));

}
}
4

3 に答える 3

24

スケジューラ タスクはグローバル クラスにのみ配置する必要があります。2 つのタスクを作成し、最初に 1 回だけスケジュールをinitialDelay= 0 ミリ秒に設定します。

2 番目のタスクでは、共通の日付/時刻クラスを使用して、現在の DateTime と次の計画された発生 (つまり、明日の 8:00) の間の秒数を計算し、この差を 24 時間にinitialDelay設定する必要があります。frequency

その結果、アプリケーションの開始時に開始され、毎日必要な時間に実行するようにタスクがスケジュールされます。

編集

完全なサンプルがあります (クラスを保存/編集: /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;
    }
}
于 2013-02-05T11:44:10.153 に答える
4

これは、グローバル クラスを使用して実行でき、onstart メソッドをオーバーライドします。https://www.playframework.com/documentation/2.5.x/JavaGlobal

以下のコードは、JVM 統計を 10 分間隔で出力します。期間は、ニーズに合わせて構成できます。

コーディングの抽象ビューを以下に示します。この助けを願っています

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

}
于 2016-09-09T11:08:52.750 に答える