2016-08-04 3 views
0

A Erlang séparés serveur stocke chat tous PIDs dans une table mnesia et les regroupe sous un ID de chambre donc lorsqu'un utilisateur envoie un message, un gen_server envoie le message à tous les processus sous cet ID de chambre.Comment puis-je piéger les sorties de processus dans le pian?

tout à ce jour fonctionne très bien, mais le problème est:

Lorsque l'utilisateur est abonné au serveur, le serveur envoie un message à tous pids pour informer les abonnés d'un nouvel abonné, mais je ne peux pas penser/savoir une façon pratique de faire l'inverse de celui-ci.

Je dois informer les gens qu'un abonné s'est désinscrit et retirer le pid de la table. Comment puis-je implémenter un tel supervsor dans le pian?

Répondre

3

Lorsque le serveur envoie un message à tous les pids pour les informer d'un nouvel abonné, il doit également notifier un processus dont le travail est erlang:monitor/2 chaque nouveau processus d'abonné. Ce processus, un gen_server, peut conserver une table de quelque sorte comme son état, comme une table map, dict ou ets, qui stocke la référence renvoyée par erlang:monitor/2 avec l'ID de pièce associé. Quand un processus d'abonné meurt, le processus de surveillance reçoit un message {'DOWN', MonitorRef, Type, Object, Info} via son gen_server:handle_info/2 function, et il peut alors rechercher le MonitorRef dans son état et notifier la salle associée de l'abonnement abandonné.