2013-06-04 62 views
0

我有一個牛仔的WebSocket服務器。許多客戶通過websocket發送消息。我需要對消息進行處理。我能做到這一點在websocket_handle,但是因爲它是實時的,我想避開它,而不是我想將消息發送到全球的過程,其中可以完成所有的處理。牛仔的WebSocket全球處理

由於每個牛仔都有它自己的進程如何運行的過程,每一個用戶可以發送消息和處理可以在這一過程中來完成。

回答

3

只是爲了澄清,每個WebSocket連接將在牛仔它自己的Erlang進程,所以從不同的WebSocket客戶消息將在不同進程進行處理。

如果您需要從WebSocket的移動處理,你可以簡單地啓動一個新的處理程序/服務器的過程,當你啓動應用程序(例如,當您啓動牛仔)偵聽程序指令和數據。示例處理代碼:

-module(my_processor). 

-export([start/0]). 

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

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

當您啓動它時,還用全局名稱註冊進程。這樣我們可以稍後從websocket處理程序中引用它。

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

現在你可以從牛仔的websocket_handle/3功能發送的數據的處理過程:

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

注意,my_processor進程將處理來自所有連接的處理請求。如果您希望爲每個websocket連接分別創建一個進程,您可以在Cowboy的websocket_init/3函數中啓動my_processor,將my_processor進程的Pid存儲在從websocket_init返回的State參數中,並使用該pid而不是processor全局名稱。

+0

感謝johlo ..那是什麼我已經開始工作。實際上,因爲要求有點複雜,我在我的主應用程序中創建了一個單獨的應用程序..所以我創建了一個myapp文件夾,裏面保存了應用程序文件和模塊文件。我可以使用rebar編譯它們,但是當我啓動服務器時出現以下錯誤: - {「init終止於do_boot」,{{badmatch,{error,{「no such file or directory」,「rabbit.app」}}}, [{的WebSocket,啓動,0,[{文件, 「SRC/websocket.erl」},{線,14}]},{INIT,start_it,1,[]},{INIT,start_em,1,[]} ]}}在rebar.config我已成立{sub_dirs,[ 「應用/兔子」]}。 –

+0

得到它的工作!忘了在啓動腳本中添加目錄路徑:) –