2016-10-03 8 views
1

私はDependency Injectionが新しく、アプリケーションをPlay 2.5.xに移行した時点で私は学ぶ必要があります。Akkaの俳優の@Singletonの使い方は?

import scala.concurrent.duration.DurationInt 
import scala.language.postfixOps 
import akka.actor._ 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 
import scalaj.http._ 

import WorkerService 

object PollActor { 
    def props(host: String) = Props(new PollActionActor(host)) 
} 

// Actor that polls a host for information 
class PollActor(host: String) extends Actor with ActorLogging { 
    // timer for poll 
    var timer: Cancellable = context.system.scheduler.schedule(0 second, 10 second, self, TimeStep()) 

    // handle messages 
    override def receive = { 
     case TimeStep() => 
      getWork match { 
       case Some(work:String) => 
        // How to do this?: ChecklistService.doWork(work) 
       case None => 
      } 
    } 

    def getWork = { 
     try { 
      Some(Http(host) 
        .option(HttpOptions.readTimeout(10000)) 
        .option(HttpOptions.connTimeout(10000)) 
        .asString.body) 
     } catch { 
      case _:Throwable => 
      None 
     } 
    } 

    case class TimeStep() 
} 

そして、このようなコントローラ何か:

@Singleton 
class Application @Inject() (implicit system: ActorSystem) extends Controller { 
    val pollActor = system.actorOf(PollActor.props("127.0.0.1")) 

    def index = Action { 
     pollActor ! TimeStep 
    } 
} 

import javax.inject._ 
@Singleton 
class WorkerService { 
    def doWork(work:String) { 
     ... 
    } 
} 

私はこのような何かを探している俳優を持っている:

私はこのような何かを探してシングルトンサービスを持っています

アクターのタイムステップでWorkerService.doWorkに電話するにはどうすればよいですか?

答えて

1

おそらく、アプリケーションクラスでアクターを作成しないでください。

あなたの役者にサービスを次にこの

play.modules.enabled += "com.nowtv.platform.search.module.ApplicationConfigModule" 

を置く注入application.confあなたの資源がこの

class ApplicationConfigModule extends AbstractModule with AkkaGuiceSupport { 

    override def configure(): Unit = { 
    bindActor[PollActor]("poll-actor") 
    } 
} 

/のようなあなたの役者を作成するために、モジュールを使用してみてください

class PollActor @Inject()(WorkerService: workerService) extends Actor 

そしてあなたのコントローラーにアクターを注入して、そこに使用できるようにしてください

@Singleton 
class Application @Inject() (@Named("poll-actor") pollActor: ActorRef) extends Controller { 
+0

ありがとうございました。私のアプリケーションが何かを再び実行できるようになるとすぐにこれを試みます。この移行は大きな苦痛です。 'オブジェクトPollActor {(アウト:ActorRef) DEF小道具:=小道具(新しいPollActor(アウト)) } –

+0

[OK]を、これは建設中のパラメータを持っていないが、これは動作しない俳優のために働くようです{ ... } ' –

+0

私はこれを試してもうまくいきましたが、私のアプリケーションは本当に難しかったので、私はScalas singletonに戻りました。それらのパラメータを注入されたパラメータでApplicationクラスから開始しました。最初からアプリケーションを実行することは別の問題です。ありがとう! –

関連する問題