scala - 使用自定义名称 Play WebSocketActor createHandler

标签 scala playframework websocket playframework-2.0 akka

我正在使用(学习)处理 play 应用程序中的 websockets。 我的 Controller 正在使用 WebSocket.acceptWithActor

def clientWS = WebSocket.acceptWithActor[JsValue, JsValue] { _ =>
   upstream => ClientSesssionActor.props(upstream)
}

一切都很好,除了一些其他“主管”actor 需要能够使用 context.actorSelection(...) 与所有/部分 ClientSessionActor 进行通信。

但是我所有的 ClientSessionActors 都是用这样的路径创建的:

[akka://application/system/websockets/REQ_ID/handler]

这是 WebsocketActorSupervisor 创建它们的行:

val webSocketActor = context.watch(context.actorOf(createHandler(self), "handler"))

这就是路径的“handler”部分的来源。

我想为我的 ClientSessionActor 传递一个特定的名称,而不是获取“处理程序”。

用一个参数重载整个调用堆栈似乎不够优雅:有 WebSocketActor.scala 和 Connect、WebSocketActorSupervisor(属性和构造函数)、WebSocketsActor 接收,然后是 WebSocket.scala 中的所有内容。

我知道我可以将 supervisor 引用传递给 props,但是当“supervisor”已经重启并且需要重新连接他的 minions 时怎么办?

还有一件事,我意识到我可能能够获得所有“处理程序”actor,但是处理程序不止两种。是的,我可以让他们忽略针对其他处理程序组的消息,但这感觉太多余了,发送的消息比我应该发送的多 3 倍。

有什么建议吗?

詹姆斯? :)

谢谢

最佳答案

如何让每个 ClientSessionActorpreStart 上向 supervisor 发送一个 Register 消息并将它们存储在例如。 val sessions = new HashMap[String, ActorRef]

然后通过在 postStop 中发送 Unregister 取消注册

关于scala - 使用自定义名称 Play WebSocketActor createHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28847279/

相关文章:

linux - 安装 Play !在 linux 上使用激活器

java - 玩!框架 : Reuse of instances over multiple requests

javascript - 从 javascript 连接到 C# 服务器

scala - 为什么 Slick 需要使用三个等号 (===) 进行比较?

scala - 我无法在 Scala : s"label($name)"中弄清楚这一行

scala - 如何在 Scala Play 框架中进行 Twitter 反向身份验证?

javascript - 移动 Safari 上 JavaScript websocket 中的明显阻塞行为

haskell - Yesod、WebSockets 和持久性

scala - 如何跳过Scala中的可选参数?

scala - IntelliJ IDEA 不会从 SBT 项目加载 Lift 库