は私がプレイアプリケーションサーバーの起動起動スケジューラに問題があるが、アプリケーションがシャットダウンを得た後、そのコードの以下の部分を打ったときに実行スケジュールされたタスクをexcuting回避する方法:Playframework +アッカ:シャットダウンアプリケーション
// firstDay something like 1 = monday
private void startScheduler(final ImageService imageService,
final ActorSystem system) {
startImagesCleanupScheduler(imageService, system);
Logger.info("Schedulers started");
}
Runnable
ブロックがただタスクをキャンセルするのではなく、すぐに実行を開始するという私の問題です。あなたはそれを実行見ることができます
[info] - application - 1 inactive unused images cleaned from db
[info] - application - Shutting down connection pool.
[info] - application - Creating Pool for datasource 'default'
...
[info] - application - Schedulers started
[info] - play.api.Play - Application started (Prod)
:
コード明確にする:Scheduler
を開始する
次のメソッドを:
private void startImagesCleanupScheduler(ImageService imageService, ActorSystem system) {
system.scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
Duration.create(1, TimeUnit.DAYS), //Frequency 1 days
() -> {
int rows = imageService.cleanupInactiveImages();
Logger.info(String.format("%d inactive unused images cleaned from db", rows));
},
system.dispatcher()
);
}
ログIシャットダウンノートここでは最初の行をスケジューラは元の実行時間を無視してシャットダウンしてから起動し、その後は「スケジューラが起動しました。
どのようにスケジューラをキャンセルしたり、シャットダウンする前に再生を実行しないようにするのですか? Akkaのバグですか?
私は、次の質問の答えのようOnStartup
内部startScheduler
を呼んでいる:
java Playframework GlobalSettings deprecation for onStart
編集: 問題を再現する最小限のコード以下:
まずOnStartup
クラスを作成します。 :
@Singleton
public class OnStartup {
@Inject
public OnStartup(final ActorSystem system) {
startScheduler(system);
}
private void startScheduler(final ActorSystem system) {
startImagesCleanupScheduler(system);
Logger.info("Schedulers started");
}
private void startImagesCleanupScheduler(ActorSystem system) {
system.scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
Duration.create(1, TimeUnit.DAYS), //Frequency 1 days
() -> {
//int rows = imageService.cleanupInactiveImages();
rows = 1;
Logger.info(String.format("%d inactive unused images cleaned from db", rows));
},
system.dispatcher()
);
}
}
そして、モジュールを作成します。
public class OnStartupModule extends AbstractModule {
@Override
public void configure() {
bind(OnStartup.class).asEagerSingleton();
}
}
は最後にapplication.confでモジュールを有効にします。
play.modules.enabled += "modules.OnStartupModule"
また、あなたが、これはOKに見えることから、念のために、このスケジューリングを開始するために使用したコードを投稿することができますか? –
既に投稿されている質問では、http://stackoverflow.com/questions/35842293/java-playframework-globalsettings-deprecation-for-onstartを参照して起動時に作成し、ここにコードを表示してください。ログを印刷するだけで十分です。 –
@AleksandarStojadinovic私はシンプルコードを提供しました –