单独的 Erlang 聊天服务器将所有PIDs
存储在mnesia
表中,并将其分组到房间ID下,以便当用户发送消息时,{{1} }将消息发送到该房间ID下的所有进程。
到目前为止一切都很好但问题是:
当用户订阅服务器时,服务器向所有gen_server
发送消息以通知订户有关新订户的信息,但我无法想到/知道实际的方法来反转它。
我需要让人们知道订阅者已取消订阅并从表中删除pid。如何在雅司中实现这样的pids
?
答案 0 :(得分:3)
当服务器向所有pid发送消息以通知新订户时,请让它通知每个新订户进程的作业为erlang:monitor/2
的进程。该进程gen_server
可以将某种表保存为其状态,如map
,dict
或ets
表,它存储从{返回的引用{1}}以及相关的房间ID。当订阅者进程终止时,监视进程将通过其gen_server:handle_info/2
function收到erlang:monitor/2
消息,然后它可以在其状态中查找{'DOWN', MonitorRef, Type, Object, Info}
并通知相关联的房间已删除的订阅