Erlang - супервизор не перезапускает рабочий процесс
Я играю с супервизорами Erlang OTP и хочу создать простое приложение с супервизором и работником.
Я создал простой воркер на основе gen_server, который принимает 2 числа и делит первое на второе. А если второе число - 0, то вылетает с ошибкой.
И у меня есть супервайзер, который теоретически должен возобновить работу в случае неудачи. Но когда я запускаю приложение, рабочий не перезапускается после сбоя. Вместо этого ракушка давит. Я предполагаю, что это происходит из-за того, какgen_server:call
ведет себя в случае ошибки, но я не уверен.
Рабочий:
-module(my_worker).
-behaviour(gen_server).
-export([init/1,handle_call/3,create/0,terminate/2]).
create() -> gen_server:start({local,my_calc},?MODULE,0,[]).
init(_) -> {ok, {}}.
handle_call({divide, _, 0}, _From, State) ->
{stop, div_by_zero, State};
handle_call({divide, X, Y}, _From, State) ->
{reply, X / Y, State}.
terminate(Reason,State) ->
io:format("Terminated because of ~p", [Reason]).
Руководитель:
-module(my_supervisor).
-behaviour(supervisor).
-export([init/1,create/0]).
create() -> supervisor:start_link(?MODULE,{}).
init(_) ->
{
ok,
{
#{strategy => one_for_one, intensity => 10, period => 1000},
[
#{id => child_id1,
start => {my_worker, create, []},
restart => permanent,
shutdown => 1000,
type => worker,
modules => [my_worker]
}
]
}
}.
Ракушка:
c(my_worker).
c(my_supervisor).
my_supervisor:create().
gen_server:call(my_calc,{divide, 10, 2}). % 5.0
gen_server:call(my_calc,{divide, 10, 0}). % Everything dies
gen_server:call(my_calc,{divide, 10, 2}). % Worker is dead