2015-03-11 3 views
0

Я читал книгу Erlang and OTP In Action и пытался исправить исходный код в главе 4, в которой создается приложение OTP.Приложение erlang otp не перезагружается при сбоях

Там является gen_server, который имеет эти перезвонить методы (full source):

%%%=================================================================== 
%%% gen_server callbacks 
%%%=================================================================== 

init([Port]) -> 
    {ok, LSock} = gen_tcp:listen(Port, [{active, true}]), 
    {ok, #state{port = Port, lsock = LSock}, 0}. 

handle_call(get_count, _From, State) -> 
    {reply, {ok, State#state.request_count}, State}. 

handle_cast(stop, State) -> 
    {stop, normal, State}. 

handle_info({tcp, Socket, RawData}, State) -> 
    do_rpc(Socket, RawData), 
    RequestCount = State#state.request_count, 
    {noreply, State#state{request_count = RequestCount + 1}}; 
handle_info(timeout, #state{lsock = LSock} = State) -> 
    {ok, _Sock} = gen_tcp:accept(LSock), 
    {noreply, State}. 

terminate(_Reason, _State) -> 
    ok. 

code_change(_OldVsn, State, _Extra) -> 
    {ok, State}. 

%%%=================================================================== 
%%% Internal functions 
%%%=================================================================== 

супервайзера init([]) метод выглядит следующим образом (full source):

init([]) -> 
    Server = {tr_server, {tr_server, start_link, []}, 
       permanent, 2000, worker, [tr_server]}, 
    Children = [Server], 
    RestartStrategy = {one_for_one, 0, 1}, 
    {ok, {RestartStrategy, Children}}. 

Я начал программу с application:start(tcp_rpc) и telneted в приложение. Когда я выйти из телнет сессии, была брошена следующая Эрл ошибка:

=ERROR REPORT==== 11-Mar-2015::08:12:58 === 
** Generic server tr_server terminating 
** Last message in was {tcp_closed,#Port<0.733>} 
** When Server state == {state,1055,#Port<0.725>,5} 
** Reason for termination == 
** {function_clause,[{tr_server,handle_info, 
           [{tcp_closed,#Port<0.733>}, 
           {state,1055,#Port<0.725>,5}], 
           [{file,"src/tr_server.erl"},{line,87}]}, 
        {gen_server,try_dispatch,4, 
           [{file,"gen_server.erl"},{line,593}]}, 
        {gen_server,handle_msg,5, 
           [{file,"gen_server.erl"},{line,659}]}, 
        {proc_lib,init_p_do_apply,3, 
           [{file,"proc_lib.erl"},{line,237}]}]} 

=INFO REPORT==== 11-Mar-2015::08:12:58 === 
    application: tcp_rpc 
    exited: shutdown 
    type: temporary 

Я могу видеть, что приложение рушится, потому что он не имеет обработчика для tcp_closed, но я ожидал, что приложение будет перезапущен наблюдателем, но это не так.

Если диспетчер перезапустил приложение?

+0

Нет, то, что вы написали, означало, что супервизор разрешает 0 сбоев, поэтому после первого сбоя сервера диспетчер дает, он достиг своего счета, что означает, что приложение отказывается. – rvirding

+0

Я предполагаю, что я просто не принял на борт описание RestartStrategy, когда впервые прочитал его, и предположил, что предоставленная конфигурация позволит перезапустить разбитое приложение. –

ответ

2

Вы должны изменить стратегию перезапуска что-то вроде

RestartStrategy = {one_for_one, 10, 1}, 

, потому что 0, 1 означает, что приложение не может быть перезапущена на всех.

Смежные вопросы