2014-02-14 4 views
1

Вкратце - я создаю приложение 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.

ответ

5

Что вы используете для связи между вашим приложением и браузером? Длинные опросы, websockets?

В целом я ожидаю, что SwatchActor уведомит отправителя сообщения Watch, когда произойдет изменение. Когда вы отправляете сообщение за пределами актера, отправитель будет noSender, и, таким образом, уведомления будут входить в deadLetters. Что вам нужно сделать, так это создать актера, который получает уведомления и подталкивает их к пользователям через веб-узел или что-то подобное.

+0

Я буду использовать websockets. Поэтому я предполагаю, что мне нужно создать актера в моем методе 'index', который будет получать сообщения от моего работника? Как мне это сделать? Разве это не рабочий актер из контекста диспетчера в моем случае? – Caballero

+1

Вы должны создать актера всякий раз, когда клиент подключается к websocket, потому что это будет канал связи между клиентом и сервером. Всякий раз, когда этот актер получает событие от актера образца, он может просто нажать сообщение на веб-узел. – drexin

+0

Справа. Итак, как мне создать актера в моем методе 'index' и заставить его получать сообщения от актера образца? Я довольно новичок в Akka, поэтому реализация по-прежнему немного суетлива для меня. – Caballero

Смежные вопросы