2016-06-12 14 views
1

は私がプレイアプリケーションサーバーの起動起動スケジューラに問題があるが、アプリケーションがシャットダウンを得た後、そのコードの以下の部分を打ったときに実行スケジュールされたタスクを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" 
+0

また、あなたが、これはOKに見えることから、念のために、このスケジューリングを開始するために使用したコードを投稿することができますか? –

+0

既に投稿されている質問では、http://stackoverflow.com/questions/35842293/java-playframework-globalsettings-deprecation-for-onstartを参照して起動時に作成し、ここにコードを表示してください。ログを印刷するだけで十分です。 –

+0

@AleksandarStojadinovic私はシンプルコードを提供しました –

答えて

3

これはコメントのために少し長すぎるが、私はこのアプローチをテストしていない、あなたが必要な場合がありますそれを微調整する。ドキュメンテーションによれば、コンポーネントは作成された逆の順序で破棄されます。これは、ActorSystemがシャットダウンされる前にスケジューラをキャンセルする可能性があることを意味します。これは、このクラスが後に登録され、それに依存するためです。 OnStartupクラスでこのようなシャットダウンフックを作成し、スケジュールをキャンセルします。それはActorSystemシャットダウンの時点では意味、実行するために何の予定もないでしょう。

@Singleton 
public class OnStartup { 

    private final Cancellable cancellableSchedule; 

    @Inject 
    public OnStartup(final ActorSystem system, final ApplicationLifecycle l) { 
     cancellableSchedule = startScheduler(system); 
     initStopHook(l); 
    } 

    private Cancellable startScheduler(final ActorSystem system) { 
     return startImagesCleanupScheduler(system); 
     Logger.info("Schedulers started"); 
    } 

    private Cancellable startImagesCleanupScheduler(ActorSystem system) { 
     return 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() 
     ); 
    } 

    private void initStopHook(ApplicationLifecycle lifecycle) { 
     lifecycle.addStopHook(() -> { 
      cancellableSchedule.cancel(); 
     return CompletableFuture.completedFuture(null); 
     }); 
    } 

} 
+0

ありがとう、私はすぐにそれを試してみます –

+0

このソリューションの運が良かったですか? –

+0

今日、私は4日間休みましたが、今日はもう一度やってみましたが、もう一度試してみませんでした。それは1時間でテストします:) –