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
.
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"]}. –
Got It a fonctionné! oublié d'ajouter le chemin du répertoire en commençant le script :) –