Вкратце - я создаю приложение Scala/Play, которое будет отслеживать определенные файлы/папки для изменений и использовать серверные события для передачи данных в браузер.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
актер просто выводит это консоль:
[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'.
Это мой контроллер (до сих пор это не делает много):
package controllers
import play.api._
import play.api.mvc._
object Application extends Controller {
def index = Action {
Ok("index")
}
}
браузер должен установить соединение с контроллер, а затем, когда мой рабочий актер обнаруживает изменения, происходит переключение сервера на браузер. Моя проблема до сих пор: как заставить моего рабочего актера отправлять сообщения в мое действие index
в контроллере? Может ли описанный выше подход работать вообще?
UPDATE: Я буду использовать веб-порты для связи с браузером. Еще одна важная вещь: рабочий актер должен работать все время, несмотря на то, что существует установленная связь с браузером или нет.
UPDATE2: Благодаря drexin и другим, мне удалось соскрести solution.
Я буду использовать websockets. Поэтому я предполагаю, что мне нужно создать актера в моем методе 'index', который будет получать сообщения от моего работника? Как мне это сделать? Разве это не рабочий актер из контекста диспетчера в моем случае? – Caballero
Вы должны создать актера всякий раз, когда клиент подключается к websocket, потому что это будет канал связи между клиентом и сервером. Всякий раз, когда этот актер получает событие от актера образца, он может просто нажать сообщение на веб-узел. – drexin
Справа. Итак, как мне создать актера в моем методе 'index' и заставить его получать сообщения от актера образца? Я довольно новичок в Akka, поэтому реализация по-прежнему немного суетлива для меня. – Caballero