Проблема при регистрации двух локальных процессов с помощью gproc в обработчике веб-сокета cowboy

Я попытался зарегистрировать кучу процессов с уникальным именем семейства с помощью gproc под обработчиком ковбойского веб-сокета. В моем обработчике я создал два метода, первый из которых предназначен для обработки регистрации:

websocket_handle({text, <<"Reg: ",Message/binary>>}, State) ->
io:format("Client ~p requesting to register ~n",[Message]),
MyPID=list_to_binary(pid_to_list(self())),
{[{_,Family}]}=jiffy:decode(Message),
io:format("Client ~p requesting to register ~n",[Family]),
Test = gproc:reg({p, l, Family}),
erlang:display(Test),
io:format("Registration OK, replying ..."),
Result =  gproc:lookup_pids({p, l, Family}),
erlang:display(Result),
[PID] = Result,
io:format("PASS  ~n"),
io:format("PID ~p FORMATTED ~n",[PID]),
Res= list_to_binary(pid_to_list(PID)),
\"inform\",\"From\" : \"Server\",\"Message\" : \"How you are doing !\"}">>),
{reply, {text,<<"{\"Type\" : \"fb_server\",\"Action\" : \"registration\",\"From\" : \"Server\",\"Message\" : \"",Res/binary,"\"}">>}, State};

Второй - справиться с рекуперацией pis:

websocket_handle({text, <<"Get: ",Message/binary>>}, State) ->
io:format("Client ~p requesting Pids ~n",[Message]),
{[{_,Family}]}=jiffy:decode(Message),

Result =  gproc:lookup_pids({p, l, Family}),
erlang:display(Result),
if 
    Result == [] ->
       {reply, {text,<<"{\"Type\" : \"fb_server\",\"Action\" : \"Get Pids\",\"From\" : \"Server\",\"Message\" : \"Empty list\"}">>}, State};
    true ->
       [PID] = Result,
       io:format("PASS  ~n"),
       io:format("PID ~p FORMATTED ~n",[PID]),
       Res= list_to_binary(pid_to_list(PID)),
      \"fb_server\",\"Action\" : \"inform\",\"From\" : \"Server\",\"Message\" : \"How you are doing !\"}">>),
      {reply, {text,<<"{\"Type\" : \"fb_server\",\"Action\" : \"Get Pids\",\"From\" : \"Server\",\"Message\" : \"",Res/binary,"\"}">>}, State}
end.

Чтобы протестировать свой обработчик, я создал два файла js, первый — для регистрации семейства процессов, я запускаю запрос на регистрацию следующим образом:

 writeToScreen("CONNECTED");
var msg = {family: "Js"};  
websocket.send("Reg: "+JSON.stringify(msg) );

Второй тестовый файл должен получить pid процесса, уже зарегистрированного первым файлом:

function onOpen(evt)
{
//ON opening connection we will send a getPids request to get pids of                 processes registered under Family "Js" 
writeToScreen("CONNECTED");
var msg = {family: "Js"};
//websocket.send("Reg: "+JSON.stringify(msg) );
 getPids(msg);
//doSend("WebSocket rocks");
}
function getPids(msg)
{
writeToScreen("get Pids");
websocket.send("Get: "+JSON.stringify(msg) );
}

Моя проблема в том, что первый файл успешно регистрирует процесс, но второй получает пустой список, в основном он должен получить список с pid, уже созданным первым файлом ??

С наилучшими пожеланиями .


person H. SLF    schedule 31.01.2017    source источник
comment
Вы уверены, что первый веб-сокет все еще открыт, когда вы подключаете второго клиента? Если первый клиент закроет сокет, процесс erlang, обрабатывающий этот веб-сокет, будет уничтожен, а pid будет автоматически удален из реестра gproc.   -  person johlo    schedule 02.02.2017


Ответы (1)


@Stefan Zobel, вы правы, в моем событии onmessage у меня есть вызов события onclose ().

person H. SLF    schedule 03.02.2017