2016-12-28 10 views
0

それはちょうど解決での質問です。私はPlay Framework.Butで一定の時間間隔で繰り返す俳優を作成することに成功しました。しかし、私は一定の時間に活動することができる俳優、例えば「12時間」を作りたいと思っています。プレイフレームワーク2.5.xで「Clock」Akka Actorシステムを作成するには?

私の最初の解決策は、プロセッサにCalendar objectを追加し、アクターがアクティブになったときにいつでもチェックすることです。時間がセットアップ時間と等しい場合は、私のコードを実行してください。私はそれが可能な解決策だと思いますが、良い解決策ではないと思います。カレンダーオブジェクトは何度も作成されており、私はできるだけ少なく作成するCalendar objectの数を減らしたいと思います。

私は起源の他の解決策を見つけました。ドキュメント:https://www.playframework.com/documentation/2.5.x/JavaAkkaとS.O.Fの他のトピックですが、私には合いません。

どれでも解決できますか?

答えて

1

アクターシステムを使用してスケジュールを設定するクラスを作成します。

public class SchedulingTask { 

    @Inject 
    public SchedulingTask(final ActorSystem system, 
          @Named("foo-actor") ActorRef fooActor) { 
     system.scheduler().schedule(
      Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 
      Duration.create(12, TimeUnit.HOURS),  //Frequency 
      fooActor, 
      "doSomething", 
      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(FooActor.class, "foo-actor"); 
     bind(SchedulingTask.class).asEagerSingleton(); 
    } 
} 

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

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

申し訳ありません、スティーブ、私はあなたが私の問題を誤解していると思います。私はインターバルの俳優でやった。今私は俳優が目覚まし時計のように1日のうちに目を覚ますことができるようにしたい。 ほんの少しでも気にせず、私はそれを共通のスレッドに置き換えました。 – Wing

関連する問題