我在我的频道类中调用GenServer。 GenServer需要一个pid。我怎样才能坚持这个pid,这样每次调用GenServer中的join方法时,我都可以使用相同的pid调用GenServer?我应该将它保存在套接字参数中,还是应该在频道和前端javascript之间来回传递?
答案 0 :(得分:1)
我最近在遇到类似的问题时遇到了类似问题我在处理GenServers时选择使用名称而不是pids。您可以将name
参数传递给GenServer.start_link/3
,然后在其他调用中使用它(例如GenServer.cast/2
。在我的情况下,我使用发送到频道的唯一ID来为服务器生成名称(对于例如::"document-1"
)。
这种方法的最大缺点是BEAM对原子数有限制,因此如果生成的名称数量太大会导致崩溃,因此在实施此解决方案时必须考虑它。
答案 1 :(得分:0)
我解决这个问题的方法是将socket.topic
传递给GenServer进程,因为如果客户端刷新浏览器,套接字的pid可能会发生变化。
从GenServer,您可以使用MyApp.Endpoint.broadcast! socket_topic, "some_notification", message
广播回主题。
如果您选择或直接将其推送到客户端,您可以截取频道内的消息并进行处理。
答案 2 :(得分:0)
如果我没记错的话,在凤凰频道内创建的genserver进程会链接到频道进程。因此,您可能希望取消链接genserver进程与通道。然后为您的流程命名注册,以便相同的pid持续存在。