2012-04-16 7 views
5

ランダムデータを検証し、そのデータの表示時間に基づいていくつかの変更を行い、それを更新するAkkaアクターがあります。現在、私がやっていることは、コントローラの内部で、このコードを使用している:Play Framework 2.0はサーバー起動時にAkkaアクターをスケジュールします

static ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class)); 
static { 
    Akka.system().scheduler().schedule(
     Duration.Zero(), 
     Duration.create(5, TimeUnit.MINUTES), 
     instance, "VALIDATE" 
    ); 
} 

コントローラ内部でこれを使用しての問題は、誰かが俳優を開始するために、コントローラによって処理されたページにアクセスする必要があり、この場合のことです起こらない、すべては停止したままです。

サーバーの起動時にこれを行う方法はありますか?実際にアクターが例外を生成した場合の動作はわかりません。それは将来のスケジュールを止めるのか、それとも続けるのでしょうか?そうでない場合は、クラッシュやエラーの場合に俳優のスケジュールを変更する方法はありますか? Global objectを見てみましょう、サーバの起動時に、あなたのコードを実行するための

答えて

13

、ジョブのスケジューリングをすることのできる方法を提供

public class Global extends GlobalSettings { 

    @Override 
    public void onStart(Application app) { 
    ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class)); 
    Akka.system().scheduler().schedule(
     Duration.Zero(), 
     Duration.create(5, TimeUnit.MINUTES), 
     instance, "VALIDATE" 
    ); 
    } 

} 
+0

これは多くの助けになります –

1

プレイフレームワーク:onStart()方法にあなたのコントローラからコードを移動Global.javaで明示的に呼び出すことなく行われます。

など
public class Global extends GlobalSettings { 

    private Cancellable scheduler; 

    @Override 
    public void onStart(Application app) { 
     super.onStart(app); 
     schedule(); 
    } 

    @Override 
    public void onStop(Application app) { 
    //Stop the scheduler 
     if (scheduler != null) { 
      scheduler.cancel(); 
      this.scheduler = null; 
     } 
    } 
    private void schedule() { 
     try { 
      ActorRef helloActor = Akka.system().actorOf(new Props(HelloActor.class)); 
      scheduler = Akka.system().scheduler().schedule(
        Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds 
        Duration.create(30, TimeUnit.MINUTES),  //Frequency 30 minutes 
        helloActor, 
        "tick", 
        Akka.system().dispatcher(), null); 
     }catch (IllegalStateException e){ 
      Logger.error("Error caused by reloading application", e); 
     }catch (Exception e) { 
      Logger.error("", e); 
     } 
    } 
} 

と俳優を作成し、onReceive方法で、あなたは電子メールを送信し、データの処理を行うことができますでHelloActor.java

public class HelloActor extends UntypedActor { 

    @Override 
    public void onReceive(Object message) throws Exception { 
     // Do the processing here. Or better call another class that does the processing. 
     // This method will be called when ever the job runs. 
     if (message.equals("tick")) { 
      //Do something 
      // controllers.Application.sendEmails(); 
     } else { 
      unhandled(message); 
     } 
    } 
} 

・ホープ、このことができます。

関連する問題