【发布时间】:2016-02-12 00:20:30
【问题描述】:
我正在学习 Erlang。我想制作一个由主管监督的 UDP 侦听器。因此,如果侦听器进程出现故障,主管将重新启动该进程。最初我只是做了一个简单的 UDP 监听器,它按预期工作。
startudplistener() ->
{ok, Socket} = gen_udp:open(9000,[binary,{active,false}]),
Pid = spawn(pdmanager,udplistener,[Socket]),
{ok, Pid}.
udplistener(Socket) ->
{ok,Packet} = gen_udp:recv(Socket,0),
spawn(pdmanager,handleudp,[Packet]),
udplistener(Socket).
handleudp(Packet) ->
{_,_, Msg} = Packet,
io:format("I have got message : ~s ~n",[Msg]),
{handeling, Packet}.
所以,我想做的是监控 udplistener 进程。为此,我首先将模块修改为 gen_server 模块。之后写一个supervisor模块。我的主管长这样:
-module(pdmanager_sup).
-behaviour(supervisor).
-export([start_link/1]).
-export([init/1]).
start_link(Port) ->
supervisor:start_link({local,?MODULE}, ?MODULE, Port).
init(Port) ->
{ok, Socket} = gen_udp:open(Port, [binary, {active, false}]),
{ok, {{one_for_one, 5, 60},
[{listener,
{pdmanager, start_link, [Socket]},
permanent, 1000, worker, [pdmanager]}
]}}.
所以我想要这样做的是,打开一个新的 udp 套接字并将其传递给我的服务器,服务器将继续侦听套接字,而主管将监视它。所以我想出了以下代码。
start_link(Socket) ->
gen_server:start_link({local, pdmanager}, pdmanager, Socket, []).
init(Socket) ->
io:format("UDP Server starting ~n",[]),
spawn_link(pdmanager,udplistener,[Socket]),
{ok, #state{socket=Socket}}.
我对我在 init 函数中添加的 spawn_link 有点困惑。 spawn_link 正在打开另一个进程,但是它正在与调用进程建立链接。据我了解,我的主管将在这里监控呼叫过程。那么,如果我的 udplistener 出现故障,我的主管会如何表现?如果它不能按我预期的方式工作(我希望它会重新启动我的服务器),那么最好的方法是什么?
【问题讨论】:
标签: erlang