总之 - 我正在构建一个Scala/Play应用程序,它将监视某些文件/文件夹的更改,并使用Server Sent Events将数据推送到浏览器。我使用Swatch库来执行应用程序启动的监视。这是我的Global
对象。它通过发动工人的演员(据我所知),并报告启动监视是否有任何变化 - 它的工作就好了:每当一个变化发生在swatch
演员只是输出到发挥框架,Akka:演员与控制器通信
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)
}
}
目前控制台:
[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
动作发送消息?我上面描述的方法是否可以工作?
更新:我将使用websockets与浏览器进行通信。另一件重要的事情 - 工作者演员必须一直运行,尽管如果有与浏览器建立的沟通与否。
UPDATE2:感谢drexin和其他人,我设法凑齐了solution。
我将使用websockets。所以我假设我需要在我的'index'方法中创建一个将从我的工作人员接收消息的actor?我怎么做?在我的情况下,工人演员是否脱离了管制员的背景? – Caballero
每当客户端连接到websocket时,您应该创建一个actor,因为这将是客户端和服务器之间的通信通道。只要这个演员接收到swatch演员的事件,就可以将消息推送到websocket。 – drexin
对。那么如何在我的'index'方法中创建一个actor,并让它从swatch actor接收消息呢?我对Akka来说相当陌生,所以对我来说实施仍然有点挑剔。 – Caballero