明確にするために、Cowboy では各 Websocket 接続に独自の erlang プロセスがあるため、異なる Websocket クライアントからのメッセージは異なるプロセスで処理されます。
Websocket から処理を移動する必要がある場合は、アプリの起動時 (Cowboy の起動時など) に、プロセス コマンドとデータをリッスンする新しいハンドラー/サーバー プロセスを開始するだけです。サンプル処理コード:
-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).
これで、Cowboy のwebsocket_handle/3
関数から処理プロセスにデータを送信できます。
websocket_handle(Data, Req, State) ->
...,
processor ! {process_cmd, Data},
...,
{ok,Req,State}.
my_processor
このプロセスは、すべての接続からの処理要求を処理することに注意してください。Websocket 接続ごとに個別のプロセスが必要な場合はmy_processor
、Cowboy のwebsocket_init/3
関数で開始できます。my_processor
プロセスの Pid を websocket_init から返された State パラメーターに格納し、processor
グローバル名の代わりにその pid を使用します。