【问题标题】:checking user online or not play akka websockets在线检查用户或不玩akka websockets
【发布时间】:2017-02-16 17:17:47
【问题描述】:

我在前端使用带有 Scala、Akka 和 websockets 的 play 框架。 我想为用户建立一个通知套接字。如何将actorRef与用户ID连接并检查用户是否在线?

【问题讨论】:

    标签: scala playframework websocket push-notification akka


    【解决方案1】:

    不要考虑“用户是否在线”,只需考虑 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]。

    【讨论】:

    • 我可以将actorRefs存储到数据库中,而不是存储到坐标actor中吗?
    • 当然,所以你将拥有一个服务,它会在你推送一些通知时从数据库中获取给定用户 ID 的actor refs,而不是协调演员。然后你将把这个通知转发给每个actor refs。
    • 我试图添加服务,但在启动服务参与者时遇到异常。请给我一些链接,以便我能理解,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2015-04-25
    • 2020-05-01
    • 2011-06-30
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多