2010-09-30 4 views
2
de Erlang Gen serveur

Je construis une application routeur réseau à l'aide Erlang cadre du Bureau du Procureur. Dans son processus d'exécution, un superviseur crée deux genservers et chaque serveur estagen: appel (CurrentProcName, {BinEvent, UniqueTrxId, MdPid}, infinity), bloque une connexion tcp à deux serveurs individuels.La communication entre les

maintenant lors de l'exécution de l'application, il arrive que l'on genserver reçoit un événement en double, sur un tel cas, je veux cet événement à traiter par le second gen_server.

Pour cela, je fais appel gen_server: appel (NextProcName, {BinEvent, UniqueTrxId, MdPid}, l'infini),

Cette fonction, je fais appel à l'intérieur du module gen_server lorsque la condition satisfait de l'événement en double.

NextProcName :: Il est le nom enregistré pour la deuxième gen_server

NOTE :: le code reste le même pour

des deux gen_server Le problème est que je suis en mesure de reproduire les événements, mais l'événement est ne pas se passer d'une certaine manière à la deuxième gen_server :(

S'il vous plaît Si je suggère le fais dans le mauvais sens ou non.

Répondre

3

Si vous pouvez partager la source, il être apprécié. Etes-vous sûr (e) que le message a vraiment été reçu ou n'avez-vous simplement pas reçu de réponse?

Le problème le plus plausible que je vois ici est que vous transmettez un message de manière synchrone. Si ce n'est pas le cas, vous pouvez ignorer complètement mon message. Pour l'instant, nous allons voir comment le transfert synchrone joue:

client   server1    server2 
    |    |     | 
    >--- Msg1 ----> (ok)     | 
(waits S1)   |     | 
    (ok) <-- Reply ---<     | 
    >--- Msg2 ----> (ok)     | 
(waits S1)   >----- Msg2 -----> (ok) 
(waits S1)  (waits S2) <--- Reply --<  
(waits S1)  (Waits S2)    | 

      *Stuff crashes* 

Ce n'est pas tout à fait claire, mais il montre ce qui se passe. Ici Server1 est essentiellement compte toujours que le traitement du message Msg2 au comportement de gen_server, et lira donc jamais la réponse de Server2 qu'il attend. Cela finira généralement par un timeout et un crash.

La bonne façon de le faire est d'envoyer plutôt un appel asynchrone (un cast) Server1-Server2, y compris la variable From afin que Server2 peut répondre avec gen_server:reply/2 à se substituer à Server1. Server1 devrait alors retourner avec un tuple noreply. Cela va libérer le processus de Server1 et il sera en mesure de continuer à traiter d'autres choses.

+0

Vous ne donnez sûrement pas de conseils terribles: P. – Arunmu

+0

Je suis vraiment désolé que je ne peux pas partager le code à ce moment-là. Mais je vais essayer Mon niveau le mieux pour expliquer les conditions comme une réponse dans ce fil au lieu d'un commentaire. – Arunmu