2016-09-27 5 views
0

그래서 저는 다른 쾌적한 몇 가지 서비스와 상호 작용하는 (또는 곧 작동 할 예정인) RESTful 게임 앱을 보유하고 있습니다.재생 프레임 워크 스칼라 응용 프로그램이 시작되면 Runnable RabbitMQ 리스너를 어떻게 시작합니까?

그러나 재생 시작 직후 내 Runnable RabbitMQ 클래스를 시작해야만 일부 akka 배우가 작업을 수행 할 수 있습니다.

지금까지 응용 프로그램에 "GET"경로// 상태에 응답하고 모두 좋았지 만 Play에서 백그라운드 작업을 수행하는 방법으로 "예약 된 작업"에 계속 연결되었습니다. 그렇게하는 것이 옳은가?

system.scheduler().scheduleOnce() ??

로 여기 제안 : Running a continuous background task in Play 2.4.2 server


편집 : Lief 에릭슨은 무엇을 제안하려고하지만 오류 얻을 :

//@Singleton Get the error below when I uncomment this <<----- 
class Test extends Runnable { 

    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    def run() = { 
    while(true) { 
     logger.info("I'm here #################") 
     Thread.sleep(10000) 
    } 
    } 
} 

class Bindings extends AbstractModule { 

    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    override def configure() = { 
    logger.info("Configuring application ....") 
    bind(classOf[Test]).asEagerSingleton() 
    } 
} 

오류 :

[error] C:\PROJECTS\active\voldemort\app\controllers\Application.scala:29: trait Singleton is abstract; cannot be instantiated 
[error] @Singleton 
[error]^

을하지만 난 주석 때 싱글 톤 데코레이터, 로그 메시지가 나타납니다. "Configuring application ..." 당신이 Guice Module 사용하여 해당 클래스 열심히 부하를 확인해야합니다, 그리고

@Singleton 
class RabbitListener(listener: Listener[T]) { 
    listener.run() 
    ... 
} 

: OT I'm here ######### 로그 행

+0

또 다른 대안 : GlobalSettings를 확장하고 그렇게해야합니까? – dlite922

답변

1

당신은 클래스를 만들 필요가 RabbitListener 말을하고, 클래스 생성자에서 해당 리스너를 시작

import com.google.inject.AbstractModule 
class Bindings extends AbstractModule { 
    override def configure() = { 
    bind(classOf[RabbitListener]).asEagerSingleton() 
    } 
} 

그런 다음 application.conf에 모듈을 등록해야합니다 :

play.modules.enabled += org.example.Bindings 

여기에 일부 참조 : 나는 그것을 작업있어 https://www.playframework.com/documentation/2.5.x/GlobalSettings#scala

+0

DI 및 모듈에서 몇 페이지를 읽었을 뿐이며 확실히 링크 된 페이지를 읽었을 것입니다 (아마도 여러 번). 그러나이 페이지에서 어떻게 찾았습니까? 해당 페이지에서 AbstractModule 또는 play.modules.enabled를 검색하여 제로 히트를 얻었습니까? Play 설명서는 좀 더 손을 잡아야하는 n00bs가 부족합니다. 하지만 위의 시도 할께 ... – dlite922

+0

링크는 단지 일부 참조, 나는 그것이 전체 설명 아니었지만 그것이 도움이 될 줄 알았는데. 워드 프로세서는 약간 흩어져 있지만 전반적으로 괜찮습니다. –

+0

AbstractModule은 어느 패키지에 있습니까? play.api? – dlite922

0

, 여기에 추한 솔루션 (내가 아는 그래서 잘하면 사람이 응답 할 수있는, 일을 올바른 방법으로하지 않음)입니다하지만 작품과 내가 필요하지 (재시도 전화를 듣고 RMQ 백그라운드 리스너를 실행합니다)

case object StartConsumingMessage 

class RabbitMQConsumer { 
    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 
    logger.info("Voldemort Actor System starting...") 
    val system = ActorSystem("VoldemortSystem") 
    val actor = system.actorOf(Props(new RMQConsumerActor())) 
    implicit val timeout = Timeout(300 seconds) 
    actor ! StartConsumingMessage 

} 

class Bindings extends AbstractModule { 

    val logger: Logger = LoggerFactory.getLogger(this.getClass.getName) 

    override def configure() = { 
    logger.info("Configuring application ....") 
    bind(classOf[RabbitMQConsumer]).asEagerSingleton() 
    } 
}