2014-02-14 24 views
1

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

回答

5

您对应用程序和浏览器之间的通信有什么用?长时间轮询,websockets?

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

+0

我将使用websockets。所以我假设我需要在我的'index'方法中创建一个将从我的工作人员接收消息的actor?我怎么做?在我的情况下,工人演员是否脱离了管制员的背景? – Caballero

+1

每当客户端连接到websocket时,您应该创建一个actor,因为这将是客户端和服务器之间的通信通道。只要这个演员接收到swatch演员的事件,就可以将消息推送到websocket。 – drexin

+0

对。那么如何在我的'index'方法中创建一个actor,并让它从swatch actor接收消息呢?我对Akka来说相当陌生,所以对我来说实施仍然有点挑剔。 – Caballero