2014-02-14 1 views
1

간단히 말해, 특정 파일/폴더를 모니터링하여 변경 내용을 모니터링하고 서버 보낸 이벤트를 사용하여 데이터를 브라우저로 푸는 스칼라/재생 응용 프로그램을 작성하고 있습니다.Play framework, Akka : 컨트롤러와 컨트롤러의 통신

응용 프로그램과 함께 시작되는 모니터링을 수행하기 위해 Swatch 라이브러리를 사용하고 있습니다. 이것은 내 Global 개체입니다. 변경 사항이있는 경우는 작업자 배우 (지금까지 내가 이해) 및 보고서를 실행하여 모니터링을 시작합니다 - 그것은 잘 작동하고 :

import akka.actor.{Props, ActorSystem} 
import play.api._ 
import play.api.libs.concurrent.Akka 
import play.api.Play.current 
import include.Swatch._ 
import include.SwatchActor 

object Global extends GlobalSettings { 

    override def onStart(app: Application) { 
     Logger.info("Application has started") 
     val swatch = Akka.system.actorOf(Props[SwatchActor]) 
     swatch ! Watch("/folder/path", Seq(Create, Modify, Delete), true) 
    } 

} 

순간에 변화가 swatch 배우가 바로이 출력 발생할 때마다 콘솔 : 브라우저가와의 연결을 확립해야한다

package controllers 

import play.api._ 
import play.api.mvc._ 

object Application extends Controller { 

    def index = Action { 
     Ok("index") 
    } 

} 

:

[INFO] [02/14/2014 11:45:04.377] [application-akka.actor.default-dispatcher-3] [akka://application/deadLetters] Message [include.Swatch$Create] from Actor[akka://application/deadLetters] to Actor[akka://application/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

이 (지금까지 많은 일을 아니에요) 내 컨트롤러 컨트롤러를 실행하고 내 작업자가 변경 사항을 감지하면 브라우저로 서버 푸시가 발생합니다. 지금까지의 내 문제는 다음과 같습니다. 작업자가 컨트롤러의 index 작업에 메시지를 보내도록하려면 어떻게해야합니까? 위에서 설명한 접근 방식이 전혀 작동합니까?

업데이트 : 브라우저와 통신하기 위해 웹 소켓을 사용합니다. 또 다른 중요한 점은 - 브라우저와의 통신이 있는지 여부와 관계없이 항상 작업자가 실행 중이어야합니다.

UPDATE2 : 감사 drexin하는 다른 사람이 내가 함께 solution 긁어 관리했습니다.

답변

5

앱과 브라우저 간의 통신에는 무엇을 사용합니까? 긴 폴링, 웹 소켓?

일반적으로 변경 될 때 SwatchActorWatch 메시지를 보낸 사람에게 알릴 것으로 예상됩니다. 배우 외부에서 메시지를 보내면 발신자는 noSender이되어 알림은 deadLetters으로 끝납니다. 당신이해야 할 일은 알림을 수신하고 websocket이나 비슷한 것을 통해 사용자에게 알려주는 액터를 만드는 것입니다.

+0

웹 소켓을 사용할 예정입니다. 그래서 나는 내 작업자로부터 메시지를받을'index' 메소드에서 액터를 생성해야한다고 가정합니다. 어떻게해야합니까? 저의 경우 작업자가 컨트롤러의 컨텍스트에서 벗어나지 않았습니까? – Caballero

+1

클라이언트가 웹 소켓에 연결할 때마다 액터를 만들어야합니다. 클라이언트와 서버 간의 통신 채널이 될 것이기 때문입니다. 이 액터가 견본 액터로부터 이벤트를 받으면, 메시지를 websocket으로 보낼 수 있습니다. – drexin

+0

오른쪽. 그렇다면 어떻게'index' 메소드로 액터를 만들고 견본 액터로부터 메시지를 받습니까? 나는 Akka에 상당히 익숙하다. 그래서 구현은 여전히 ​​나에게 까다로울 것이다. – Caballero

관련 문제