У меня есть gen_server в одной системе и 4 клиента в 4 других системах. Код работает, как и ожидалось, в течение 3 или 4 дней, когда gen_server сообщает «** Удаление соединения (время ожидания) **». Поскольку клиенты могут стать активными до или после запуска gen_server, клиенты выполняют этот код перед каждым вызовом gen_server:
connect_IPDB() ->
% try every 5 sec to connect to the server
case net_kernel:connect_node(?SERVER) of
% When connected wait an additional 5 seconds for stablilty
true -> timer:sleep(5000);
false ->
timer:sleep(5000),
connect_IPDB()
end.
Это работает, как и ожидалось, при запуске сервера или клиента в любом порядке. Все они подключаются и отображаются в узлах() при выполнении на сервере.
Вот в чем проблема. Через некоторое время после ошибки «** Удаление (тайм-аут) соединения **» nodes() показывает все узлы, подразумевая, что клиент не завис и выполнил приведенный выше код. Однако связь с узлом с истекшим временем ожидания не возобновилась. Как я могу восстановить соединение, не перезапуская клиент? Кстати, перезапуск клиента решает проблему.
Любая помощь, приветствуется.
'DOWN'
от этого монитора.. Поместите клиент под супервизор, который перезапускает его в момент попытки подключения, как указано выше. - person zxq9   schedule 06.08.2015supervisor
). Сказать ему, чтобы он управлял вашим клиентом, — это обычный способ работы. Вы можете написать своего супервайзера/менеджера в raw. Erlang вручную, чтобы понять, как все работает, если хотите, но использование супервизоров, предоставляемых OTP, требует значительно меньше кода (но немного чтения в первый раз). - person zxq9   schedule 06.08.2015