ИЗМЕНИТЬ: ниже.
Почему мой контролируемый gen_server так быстро отключается?
Я дам эти организационные имена, чтобы сделать более понятной цепочку команд, которую я хочу использовать в своем приложении: сначала я начну с «монтажного_линейного_работника», а позже я добавлю «специалиста по маркетингу» в свое дерево наблюдения...
ceo_supervisor.erl
-module(ceo_supervisor).
-behaviour(supervisor).
-export([start_link/1]).
-export([init/1]).
start_link(State) ->
supervisor:start_link({local,?MODULE}, ?MODULE, [State]).
init([Args]) ->
RestartStrategy = {one_for_one, 10, 60},
ChildSpec= {assembly_line_worker_supervisor,
{assembly_line_worker_supervisor, start_link, [Args]},
permanent, infinity, supervisor, [assembly_line_worker_supervisor]},
{ok, {RestartStrategy, [ChildSpec]}}.
assembly_line_worker_supervisor.erl
-module(assembly_line_worker_supervisor).
-behaviour(supervisor).
-export([start_link/1]).
-export([init/1]). %% Internal
start_link(State) ->
supervisor:start_link({local, ?MODULE}, ?MODULE, [State]).
init([Args]) ->
RestartStrategy = {one_for_one, 10, 60},
ChildSpec = {assembly_line_worker, {assembly_line_worker, start_link, [Args]}, permanent,
infinity, worker, [assembly_line_worker]},
{ok, {RestartStrategy, [ChildSpec]}}.
assembly_line_worker.erl
-module(assembly_line_worker).
...
init([State]) ->
process_flag(trap_exit, true),
{ok, State}.
start_link(State) ->
gen_server:start_link({global, ?MODULE}, ?MODULE, [State], []).
handle_cast(...,State} ->
io:format("We're getting this message.~n",[]),
{noreply, State};
...
Происходит то, что работник сборочной линии выполняет небольшую часть работы, например получает пару сообщений, которые отправляются сразу после вызова команды ceo_supervisor:start_link(#innovative_ideas{}), а затем завершает работу. Есть идеи, почему? Я знаю, что gen_server получает несколько сообщений, потому что он io:format отправляет их на консоль.
Спасибо!
EDIT: я размещаю это в Windows через erlsrv.exe, и я обнаружил, что когда я запускаю свою программу с помощью такой функции:
start() ->
ceo_supervisor:start_link(#innovative_ideas{}),
assembly_line_worker:ask_for_more_pay(), %% Prints out "I want more $$$" as expected,
ok.
...выход из этой функции немедленно приводит к отключению моих супервизоров / gen_servers. Я ожидал бы этого, потому что все это связано через контроль с исходным процессом вызова, поэтому, когда он завершается, то же самое должны делать и дети.
Поэтому я думаю, что лучше было бы задать вопрос, как я могу разрешить своим супервизорам продолжать работу после прохождения всех начальных настроек? Есть ли вариант, кроме как обернуть все это в приложение? (что не так уж и плохо...)
Спасибо за наводящие вопросы! Так я больше узнал о супервайзерах.
Бэтмен
"Args"
означает как реальный необходимый список аргументов, так и только один фрагмент данных аргументов. - person rvirding   schedule 11.10.2012