2016-10-03 3 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

아마도 Application 클래스에 액터를 만들면 안됩니다.

당신의 배우로 서비스를 다음이

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 

그리고 Actor를 컨트롤러에 삽입하여 거기에 사용할 수 있도록하십시오.

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

고맙습니다. 애플리케이션을 다시 실행할 수있게되자 마자이 마이그레이션을 시도 할 것입니다.이 마이그레이션은 엄청난 고통입니다. –

+0

좋아,이 건설에 매개 변수가없는 배우를 위해 작동하는 것 같다,하지만이 작동하지 않습니다 '객체 PollActor { 데프 소품 (아웃 : ActorRef) = 소품 (교체 아웃 새로운 PollActor()) } { ... } –

+0

나는 이것을 시도했지만 효과가 있었지만 응용 프로그램이 정말 힘들어서 Scalas singleton으로 되돌 렸습니다. 패턴을 생성하고 주입 된 매개 변수로 Application 클래스에서 시작했습니다. 처음부터 응용 프로그램을 작성하는 것은 다른 문제입니다. 감사! –

관련 문제