2016-06-30 10 views
6

PlayFramework 2.5.4とMongoDBを使用するPlay-Projectがあります。毎日データベースを更新したいと考えています。現時点では、1日が過ぎればリクエストと更新を得るたびに時間をチェックします。現在のプレーヤーは、要求が PlayFramework 2.5.X(Java)の非同期タスクのスケジュール

  • を終了するまでにも何もない場合、1日更新なしがあることが起こる可能性が(私たちは日常のものを望む静かな長い時間を待たなければならない

    1. :いくつかの問題につながる 変更)
    2. 私たちが挿入するすべてのリクエストを変更する必要があります。

    私はすでにAKKAと古いスタックオーバーフローのドキュメント(How to schedule task daily + onStart() in Play 2.0.4?など)を発見しました。しかし、その解決法はもう働きません。

    Akka.system().scheduler() 
    

    が廃止されました

    system.scheduler() 
    

    はcompilingerrors(from docu)を与えると私はインポートが見つからないか、他に何されるかどうかを知るいけません。 バージョン2.4以降は@injectを使うべきだと知っていますが、スケジュールの使い方やafterallの使い方の例を見つけることはできません。

    実際はすべてPlayerDBHandler.newDay()を呼び出すだけです同じ日に一日。コンパイルエラーを見ずにヘルプ

  • 答えて

    14

    ため

    おかげで、私はsystemが定義されていないことを推測しています。ドキュメントから例を展開すると、このようなものが動作するはずです。

    public class SchedulingTask { 
    
        @Inject 
        public SchedulingTask(final ActorSystem system, 
              @Named("update-db-actor") ActorRef updateDbActor) { 
         system.scheduler().schedule(
          Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 
          Duration.create(1, TimeUnit.DAYS),  //Frequency 
          updateDbActor, 
          "update", 
          system.dispatcher(), 
          null); 
        } 
    } 
    

    systemが注入され、アクタへの参照を注入することもできます。また、systemから俳優の参照を検索することもできます。

    これを適合させたら、SchedulingTaskをモジュールに宣言します。

    package com.example; 
    import com.google.inject.AbstractModule; 
    import play.libs.akka.AkkaGuiceSupport; 
    
    public class MyModule extends AbstractModule implements AkkaGuiceSupport { 
        @Override 
        protected void configure() { 
         bindActor(UpdateDbActor.class, "update-db-actor"); 
         bind(SchedulingTask.class).asEagerSingleton(); 
        } 
    } 
    

    最後に、アプリケーションのconfを更新して、モジュールを有効にします。

    play.modules.enabled += "com.example.MyModule"