У меня есть один процесс, который отправляет сообщение о паузе на gen_server следующим образом:
Results = [gen_server:cast(Child, pause) ||
{Id, Child, _Type, _Modules} <- supervisor:which_children(?SERVER),
?IGNORE(Id) == false],
В моем gen_server я перехватываю эти сообщения в своем handle_cast следующим образом:
handle_cast(pause, #state{task=#task{server=Serv,
service=Srv,
description=Desc}}=State) ->
lager:info("Suspending ~s, ~s, ~s.",[Serv, Srv, Desc]),
{noreply, State#state{suspended=true}};
handle_cast(Msg, State) ->
lager:error("Url Poller received unexpected cast message: ~p",[Msg]),
{noreply, State}.
Что действительно странно, так это то, что довольно часто один из моих gen_servers, кажется, не получает сообщение о паузе - я не получаю более позднего сообщения, и рассматриваемый процесс не отвечает на последующие попытки приостановить (или возобновить).
Любые идеи о том, что может происходить?
gen_server очень прост, он использует erlang:send_after/3 для отправки самого себе сообщения «опрос». После получения этого сообщения опроса, если оно не приостановлено, оно переходит по URL-адресу, сохраняет ответ в ETS и запускает другой erlang:send_after/3 для повторного опроса через соответствующий интервал. Если он приостановлен, он просто запускает другой erlang:send_after?3
Все, что делает пауза, это устанавливает состояние paused = true
Используя наблюдатель, зависший процесс показывает, что текущая функция — httpc:handle_answer и что очередь сообщений резервируется.
Вкладка Sate: информация "Время ожидания истекло" Совет "системные сообщения, вероятно, не обрабатываются этим процессом"
верхняя часть трассировки стека показывает httpc:handle_answer httpc.erl:636