简而言之 - 我正在构建一个Scala / Play应用程序,它将监视某些文件/文件夹的更改,并使用Server Sent Events将数据推送到浏览器。
我正在使用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
actor只会将其输出到控制台:
[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")
}
}
浏览器应该与控制器建立连接,然后每当我的工作者检测到更改时,就会发生服务器推送到浏览器。到目前为止,我的问题是:如何让我的worker actor向控制器中的index
动作发送消息?我上面描述的方法是否可行?
更新:我将使用websockets与浏览器进行通信。另一个重要的事情 - 工人演员必须一直在运行,尽管与浏览器建立了沟通与否。
UPDATE2:感谢drexin和其他人,我设法凑到了solution。
答案 0 :(得分:5)
您在应用和浏览器之间进行通信时使用了什么?长轮询,websockets?
一般情况下,我希望SwatchActor
在发生更改时通知发件人Watch
消息。当您从演员外部发送消息时,发件人将为noSender
,因此通知将以deadLetters
结尾。你要做的是创建一个接收通知的actor,并通过websocket或类似的东西将它们推送给用户。