Я пытаюсь подключить gen_server к другому gen_server, и во время подключения серверы должны контролировать друг друга и знать, когда сервер вышел из строя, либо весь узел, либо серверный процесс. после того, как я делаю первую ссылку start_link и один из серверов выходит из строя, другой сервер получает сообщение от монитора в коде (функция handle_info активирована), но когда это происходит во второй раз, монитор отправляет информацию непосредственно в оболочку ( сообщение не проходит через handle_info и направляется непосредственно в оболочку, видимую только с помощью flush() внутри оболочки), и сервер, который должен был получать предупреждения от монитора, не получает никаких сообщений. мой код на стороне отправки:
handle_call({connect, Node, Who}, _From, _State) ->
case Who of
cdot -> ets:insert(address, {cdot, Node}), ets:insert(address,
{Node, cdot}), monitor_node(Node, true);
cact -> ets:insert(address, {cact, Node}), ets:insert(address,
{Node, cdot}), monitor_node(Node ,true);
ctitles -> ets:insert(address, {ctitles, Node}),
ets:insert(address, {Node, cdot}), monitor_node(Node, true);
_-> ok
end,
[{_, Pid2}] = ets:lookup(?name_table3, pidGui),
Pid2 ! {db, "Node "++ atom_to_list(Who) ++ " connected"}, %print to
gui witch node was connected
{reply, {{node(), self()}, connected}, node()};
а на принимающей стороне:
connect() ->
{{Node, Pid}, Connected} = gen_server:call(server_node(), {connect,
node(), cact}),
monitor_node(Node, true),
monitor(process, Pid),
Connected.
пожалуйста, кто-нибудь может сказать мне, почему это происходит?
то же самое происходит для мониторинга узла или процесса.