У меня есть руководитель simple_one_for_one
, у которого gen_fsm
детей. Я хочу, чтобы каждый дочерний элемент gen_fsm
отправлял сообщение только в последний раз, когда он завершался. Есть ли способ узнать, когда последний цикл?
вот мой куратор:
-module(data_sup).
-behaviour(supervisor).
%% API
-export([start_link/0,create_bot/3]).
%% Supervisor callbacks
-export([init/1]).
%%-compile(export_all).
%%%===================================================================
%%% API functions
%%%===================================================================
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
RestartStrategy = {simple_one_for_one, 0, 1},
ChildSpec = {cs_fsm, {cs_fsm, start_link, []},
permanent, 2000, worker, [cs_fsm]},
Children = [ChildSpec],
{ok, {RestartStrategy, Children}}.
create_bot(BotId, CNPJ,Pid) ->
supervisor:start_child(?MODULE, [BotId, CNPJ, Pid]).
Pid
— это PID процесса, который запускает супервизор и отдает приказы запускать дочерние процессы.
-module(cs_fsm).
-behaviour(gen_fsm).
-compile(export_all).
-define(SERVER, ?MODULE).
-define(TIMEOUT, 5000).
-record(params, {botId, cnpj, executionId, pid}).
%%%===================================================================
%%% API
%%%===================================================================
start_link(BotId, CNPJ, Pid) ->
io:format("start_link...~n"),
Params = #params{botId = BotId, cnpj = CNPJ, pid = Pid},
gen_fsm:start_link(?MODULE, Params, []).
%%%===================================================================
%%% gen_fsm callbacks
%%%===================================================================
init(Params) ->
io:format("initializing~n"),
process_flag(trap_exit, true),
{ok, requesting_execution, Params, 0}.
requesting_execution(timeout,Params) ->
io:format("erqusting execution"),
{next_state, finished, Params,?TIMEOUT}.
finished(timeout, Params) ->
io:format("finished :)~n"),
{stop, normal, Params}.
terminate(shutdown, _StateName, Params) ->
Params#params.pid ! {terminated, self(),Params},
ok;
terminate(_Reason, _StateName, Params) ->
ok.
я хочу сказать, что если процесс дает сбой в любом из состояний, он должен отправлять сообщение, только если это последний раз, когда он перезапускается супервизором (в соответствии с его стратегией перезапуска).
Если gen_fsm
дает сбой, перезапускается ли он из того же состояния с теми же данными состояния? Если нет, как я могу заставить это произойти?
gen_fsm
из-за какого-то ожидаемого триггера, а о ненормальном завершении, потому что процесс умер? Вы просто хотите подсчитать, когда супервизор перезапуститcs_fsm
, и отправить сообщение, когда супервизор больше не собирается его перезапускать, на случай, если он снова умрет? - person Greg   schedule 25.02.2016gen_fsm
(я привел два примера, как это сделать), чем допустить сбойgen_fsm
и пытаться добавить некоторую логику для обработки этого супервизору. - person Greg   schedule 25.02.2016