2013-06-04 2 views
0

J'ai un serveur cow-boy websocket. De nombreux clients envoient un message sur le WebSocket. Je dois faire le traitement sur le message. Je peux le faire dans websocket_handle, Cependant comme c'est en temps réel je voudrais l'éviter à la place je veux envoyer le message à un processus global où tout le traitement peut être fait.Websocket Cowboy Traitement global

Comme chaque cow-boy a son propre processus Comment exécuter un processus où chaque utilisateur peut envoyer un message et le traitement peut être fait dans ce processus.

Répondre

3

Juste pour préciser, chaque connexion websocket aura son propre processus de Erlang dans Cowboy, de sorte que les messages de différents clients WebSocket seront traitées dans processus différents. Si vous devez déplacer le traitement depuis la WebSocket, vous pouvez simplement démarrer un nouveau processus gestionnaire/serveur lorsque votre application démarre (par exemple lorsque vous démarrez Cowboy) qui écoute les commandes et les données du processus. Exemple de code de traitement:

-module(my_processor). 

-export([start/0]). 

start() -> 
    spawn(fun process_loop/0). 

process_loop() -> 
    receive 
    {process_cmd, Data} -> 
     process(Data) 
    end, 
    process_loop(). 

Lorsque vous le démarrez, enregistrez également le processus avec un nom global. De cette façon, nous pouvons le référencer à partir des gestionnaires websocket plus tard.

Pid=my_processor:start(). 
register(processor, Pid). 

Maintenant, vous pouvez envoyer les données de la fonction de Cowboy websocket_handle/3 au processus de manutention:

websocket_handle(Data, Req, State) -> 
     ..., 
     processor ! {process_cmd, Data}, 
     ..., 
     {ok,Req,State}. 

Notez que le processus my_processor traitera les demandes de traitement de toutes les connexions. Si vous voulez avoir un processus séparé pour chaque connexion websocket vous pouvez commencer my_processor dans la fonction websocket_init/3 de Cowboy, stocker le Pid du processus my_processor dans le paramètre State retourné depuis websocket_init et utiliser ce pid au lieu du nom global processor.

+0

Merci johlo .. C'est sur quoi j'ai commencé à travailler. En fait, comme l'exigence est un peu compliquée, je crée une application séparée au sein de mon application principale. J'ai donc créé un dossier myapp à l'intérieur duquel j'ai conservé le fichier de l'application et le fichier du module. Je peux les compiler en utilisant rebar cependant quand je commence le serveur j'obtiens l'erreur suivante: - {"init terminant dans do_boot", {{badmatch, {error, {"aucun tel dossier ou répertoire", "rabbit.app"}}}, [{websocket, start, 0, [{fichier, "src/websocket.erl"}, {ligne, 14}]}, {init, start_it, 1, []}, {init, start_em, 1, []} ]}} dans rebar.config j'ai défini {sub_dirs, ["apps/rabbit"]}. –

+0

Got It a fonctionné! oublié d'ajouter le chemin du répertoire en commençant le script :) –