【发布时间】:2017-02-16 17:17:47
【问题描述】:
我在前端使用带有 Scala、Akka 和 websockets 的 play 框架。 我想为用户建立一个通知套接字。如何将actorRef与用户ID连接并检查用户是否在线?
【问题讨论】:
标签: scala playframework websocket push-notification akka
我在前端使用带有 Scala、Akka 和 websockets 的 play 框架。 我想为用户建立一个通知套接字。如何将actorRef与用户ID连接并检查用户是否在线?
【问题讨论】:
标签: scala playframework websocket push-notification akka
不要考虑“用户是否在线”,只需考虑 websocket 的工作原理。它是需要启动连接的前端,因此您会自动获得用户在线的信息(更准确地说,是登录用户的网络浏览器)。
我将创建一个作为所有其他 websocket 参与者(直接处理 websocket 的参与者)的协调者的参与者。这个协调器会有一个 userId 到 Seq[ActorRef] 的映射。这是一个值是 Seq[_] 的映射,因为用户可以同时打开多个浏览器选项卡(许多 actorRef 对应一个 userId),您应该正确处理它。每当客户端启动连接时,都会创建一个新的 websocket actor。在这个演员的开始,你可以将它注册到协调演员(覆盖 preStart)。当 websocket actor 被销毁(websocket 连接已关闭)时,取消注册它。在协调器中注册/取消注册会导致将此 websocket 的 actorRef 添加/删除到地图中。
要向用户(客户端登录的浏览器)推送通知,请向包含 userId 的协调器参与者发送一条消息(当然还有通知的其余部分)。这个actor会根据userId在map中找到所有的websocket actor,然后将消息转发给他们。
文档中描述了 Play 中 websockets 的技术方面,您可能已经看过 -> https://www.playframework.com/documentation/2.5.x/ScalaWebSockets
更新:澄清 actorRefs 我的意思是 Seq[ActorRef]。
【讨论】: