2017-01-15 6 views
0

私はプレイアプリケーションの中で私の俳優を設定したいと思います。たとえば、メッセージキューをポーリングするか、x分ごとに実行する俳優がいます。プレイアプリケーションで私の俳優を設定する場所は?

私はプレイアプリケーションでアクターシステムの名前を変更しました。そこで、アクターシステムを取得する方法を説明します。

play.akka.actor-system = "myAkka" 

私は、コントローラの内部の依存性注入を使用した俳優のシステムを得ることができます知っているが、私はコントローラレベルでそれを必要としない、私は自分のアプリケーションが要求/応答レベルの外に開始したときにこれを実行する必要があります。

答えて

0

方法の1つは、あなたの俳優を熱心なシングルトンでクレートすることです。

は次のようにシングルトンを作成します。次のように

package com.app; 

import akka.actor.ActorRef; 
import akka.actor.ActorSystem; 

import javax.inject.Inject; 
import javax.inject.Singleton; 

@Singleton 
public class ActorBootstrap { 

    private ActorRef somaActor; 

    @Inject 
    public ActorBootstrap(ActorSystem system) { 
     // Craete actors here: somaActor = system.actorOf() 
    } 

    public ActorRef getSomaActor() { 
     return somaActor; 
    } 

} 

はGuiceのモジュールに熱心なようシングルトンを定義します。

package com.app; 

import com.google.inject.AbstractModule; 

public class AppModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(ActorBootstrap.class).asEagerSingleton(); 
    } 

} 

は詳細についてはhttps://www.playframework.com/documentation/2.5.x/JavaDependencyInjection#Eager-bindingsを参照してください。

(application.confに次の行を追加します)プレイして、あなたのモジュールを登録します。

play.modules.enabled += "com.app.AppModule" 

は詳細についてはhttps://www.playframework.com/documentation/2.5.x/JavaDependencyInjection#Programmatic-bindingsを参照してください。

+0

もチェックしてくださいhttps://www.playframework.com/documentation/2.5.x/ScalaAkka#dependency-injecting-actors – LuisKarlos

0

次に、スケジュールされたアクターの実装の基本的な例を示します。

俳優のスケジュール、いくつかの定期的な仕事:

public class ScheduledActor extends AbstractActor { 
    // Protocol 
    private static final String CANCEL = "cancel"; 
    private static final String TICK = "tick"; 
    // The first polling in 30 sec after the start 
    private static final int TICK_INTERVAL_SEC = 90; 
    private static final int TICK_INTERVAL_SEC = 90; 
    private Cancellable scheduler; 

    public static Props props() { 
     return Props.create(ScheduledActor.class,()->new ScheduledActor()); 
    } 

    public ScheduledActor() { 
     receive(ReceiveBuilder 
      .matchEquals(TICK, m -> onTick()) 
      .matchEquals(CANCEL, this::cancelTick) 
      .matchAny(this::unhandled) 
      .build()); 
     } 

     @Override 
     public void preStart() throws Exception { 
      getContext().system().scheduler().scheduleOnce( 
       Duration.create(ON_START_POLL_INTERVAL, TimeUnit.SECONDS), 
       self(), 
       TICK, 
       getContext().dispatcher(), 
       null); 
     } 

     @Override 
     public void postRestart(Throwable reason) throws Exception { 
      // No call to preStart 
     } 

     private void onTick() { 
      // do here the periodic stuff 
      ... 
      getContext().system().scheduler().scheduleOnce( 
       Duration.create(TICK_INTERVAL_SEC, TimeUnit.SECONDS), 
       self(), 
       TICK, 
       getContext().dispatcher(), 
       null); 
    } 

    public void cancelTick(String string) { 
     if (scheduler != null) { 
      scheduler.cancel(); 
     } 
    } 
} 

は俳優のライフサイクルハンドラが作成され、俳優やアプリケーションの停止時に、それを取り消す:

public class ScheduledActorMonitor { 
    private ActorRef scheduler; 
    private ActorSystem system; 

    @Inject 
    public ScheduledActorMonitor(ActorSystem system, ApplicationLifecycle lifeCycle) { 
     this.system = system; 
     initStopHook(lifeCycle); 
    } 

    public void startPolling() { 
     scheduler = system.actorOf(ScheduledActor.props();    
    } 

    public void cancelTick() { 
     if (scheduler != null) { 
      scheduler.tell(HelloScheduler.CANCEL, null); 
     } 
    } 

    private void initStopHook(ApplicationLifecycle lifeCycle) { 
     lifeCycle.addStopHook(() -> { 
      cancelTick(); 
      return CompletableFuture.completedFuture(null); 
     }); 
    } 
} 

StartupHandlerはシングルトンとして注入されます。それはコンストラクタで俳優のモニターを受信して​​、ポーリングを開始します:StartupHandlerはデフォルトモジュールの再生モジュールによって、注射のために登録されている

@Singleton 
public class StartupHandler { 
    @Inject 
    public StartupHandler(final ScheduledActorMonitor schedularMonitor) { 
     schedularMonitor.startPolling(); 
    } 
} 

public class Module extends AbstractModule { 
    @Override 
    public void configure() { 
     bind(StartupHandler.class).asEagerSingleton(); 
    } 
} 

あなたはhere詳細を読むことができます。

関連する問題