播放框架,Akka:演员与控制器沟通

时间:2014-02-14 12:36:18

标签: scala playframework playframework-2.0 akka actor

简而言之 - 我正在构建一个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

1 个答案:

答案 0 :(得分:5)

您在应用和浏览器之间进行通信时使用了什么?长轮询,websockets?

一般情况下,我希望SwatchActor在发生更改时通知发件人Watch消息。当您从演员外部发送消息时,发件人将为noSender,因此通知将以deadLetters结尾。你要做的是创建一个接收通知的actor,并通过websocket或类似的东西将它们推送给用户。