Tôi rất mới để OTP, tôi đang cố gắng để tạo ra ví dụ đơn giản để hiểu người giám sát hành vi:Tại sao người giám sát của tôi chấm dứt?
Đây là increment đơn giản máy chủ
-module(inc_serv).
-behaviour(gen_server).
-export([ start/0, inc/1, stop/0 ]).
-export([ init/1, handle_call/3, terminate/2 ]).
start() ->
gen_server:start_link({ local, ?MODULE }, ?MODULE, no_args, []).
stop() ->
gen_server:call(?MODULE, stop).
inc(Num) ->
gen_server:call(?MODULE, { num, Num }).
init(no_args) ->
io:format("~p~n", [ "Increment server started :)" ]),
{ ok, no_state }.
handle_call({ num, Num }, _From, no_state) ->
{ reply, Num + 1, no_state };
handle_call(stop, _From, no_state) ->
{ stop, normal, ok, no_state }.
terminate(Reason, no_state) ->
io:format("~p~n", [ "Increment server stopped" ]).
Và tôi muốn làm cho nó giám sát của thành viên này mô-đun:
-module(supervisor_inc).
-behaviour(supervisor).
-export([ start/0 ]).
-export([ init/1 ]).
start() ->
supervisor:start_link({ local, ?MODULE }, ?MODULE, no_args).
init(no_args) ->
process_flag(trap_exit, true),
Supervisor_Spec = { one_for_one, 1, 1 },
IncServ_Spec = {
inc_serv,
{ inc_serv, start, [] },
permanent, 2000, worker, [ inc_serv ] },
{ ok, { Supervisor_Spec, [ IncServ_Spec ] } }.
Sau đó tôi đã thực hiện trong erlang vỏ bước tiếp theo:
1>
1> c(inc_serv).
{ok,inc_serv}
2>
2> c(supervisor_inc).
{ok,supervisor_inc}
3>
3> supervisor_inc:start().
"Increment server started :)"
{ok,<0.43.0>}
4>
4> inc_serv:inc(7).
8
5> inc_serv:inc(8).
9
Sau này, tôi đã cố gắng tiếp theo (như tôi mong đợi Tôi đã có lỗi):
6> inc_serv:inc(bad_arg).
"Increment server stopped"
"Increment server started :)"
=ERROR REPORT==== 23-Aug-2012::19:32:06 ===
** Generic server inc_serv terminating
** Last message in was {num,bad_arg}
** When Server state == no_state
** Reason for termination ==
** {badarith,[{inc_serv,handle_call,3,[{file,"inc_serv.erl"},{line,22}]},
{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]}
=ERROR REPORT==== 23-Aug-2012::19:32:06 ===
** Generic server supervisor_inc terminating
** Last message in was {'EXIT',<0.31.0>,
{{{badarith,
[{inc_serv,handle_call,3,
[{file,"inc_serv.erl"},{line,22}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{gen_server,call,[inc_serv,{num,bad_arg}]}},
[{gen_server,call,2,
[{file,"gen_server.erl"},{line,180}]},
{erl_eval,do_apply,6,
[{file,"erl_eval.erl"},{line,576}]},
{shell,exprs,7,[{file,"shell.erl"},{line,668}]},
{shell,eval_exprs,7,
[{file,"shell.erl"},{line,623}]},
{shell,eval_loop,3,
[{file,"shell.erl"},{line,608}]}]}}
** When Server state == {state,
{local,supervisor_inc},
one_for_one,
[{child,<0.48.0>,inc_serv,
{inc_serv,start,[]},
permanent,2000,worker,
[inc_serv]}],
undefined,1,1,
[{1345,739526,107495}],
supervisor_inc,no_args}
** Reason for termination ==
** {{{badarith,[{inc_serv,handle_call,3,[{file,"inc_serv.erl"},{line,22}]},
{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{gen_server,call,[inc_serv,{num,bad_arg}]}},
[{gen_server,call,2,[{file,"gen_server.erl"},{line,180}]},
{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,576}]},
{shell,exprs,7,[{file,"shell.erl"},{line,668}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,623}]},
{shell,eval_loop,3,[{file,"shell.erl"},{line,608}]}]}
** exception exit: {{badarith,[{inc_serv,handle_call,3,
[{file,"inc_serv.erl"},{line,22}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{gen_server,call,[inc_serv,{num,bad_arg}]}}
in function gen_server:call/2 (gen_server.erl, line 180)
Sau này, tôi đã mong đợi - người giám sát của tôi khởi động lại inc_serv
. Nhưng không:
7> inc_serv:inc(8).
** exception exit: {noproc,{gen_server,call,[inc_serv,{num,8}]}}
in function gen_server:call/2 (gen_server.erl, line 180)
Bạn có thể giúp tôi hiểu điều gì đã xảy ra không? Và làm thế nào tôi nên viết lại người giám sát của tôi, để làm cho nó có thể khởi động lại inc_serv
Cảm ơn
Cảm ơn cho câu trả lời tuyệt vời! – stemm