2016-08-04 84 views
0

單獨二郎聊天服務器存儲下一個房間ID,以便當用戶發送的消息的mnesia表和組他們所有PIDs,A gen_server將消息發送到根據該房間ID的所有進程。如何捕獲雅司病毒中的進程退出?

到目前爲止一切都很正常,但問題是:

當用戶訂閱服務器,該服務器將消息發送到所有pids通知有關新用戶的用戶,但我想不出/知道切實可行的做法。

我需要讓人們知道訂戶已取消訂閱並從表中刪除該pid。我怎樣才能在雅司中實現這樣的supervsor

回答

3

當服務器向所有pids發送一條消息以通知他們一個新的訂閱者時,是否還通知一個進程,該進程的作業是erlang:monitor/2每個新的訂閱者進程。該過程(gen_server)可以保留某種表格作爲其狀態,如map,dictets表格,該表格存儲從erlang:monitor/2返回的引用以及關聯的房間ID。當用戶進程死亡時,監控進程將通過其gen_server:handle_info/2 function收到一條{'DOWN', MonitorRef, Type, Object, Info}消息,然後它可以在其狀態中查找MonitorRef,並通知相關聯的房間丟失預訂。