次のように、一時停止メッセージを gen_server に送信するプロセスが 1 つあります。
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 の 1 つが一時停止メッセージを受信していないように見えることです。より大きなメッセージが表示されず、問題のプロセスはその後の一時停止 (または再開) の試行に応答しません。
何が起こっているのかについてのアイデアはありますか?
gen_server は非常に単純で、erlang:send_after/3 を使用して自分自身に「ポーリング」メッセージを送信します。このポーリング メッセージを受信すると、一時停止されていなければ、URL にヒットし、応答を ETS に保存し、別の erlang:send_after/3 を起動して、適切な間隔の後に再度ポーリングします。一時停止されている場合は、単純に別の erlang:send_after?3 を起動します。
すべての一時停止は、状態を一時停止 = true に設定することです
オブザーバーを使用すると、スタックしたプロセスは、現在の関数が httpc:handle_answer であり、メッセージ キューがバックアップされていることを示しています。
Sate タブ: 情報「タイムアウト」 ヒント「システム メッセージは、このプロセスでは処理されない可能性があります」
スタック トレースの上部に httpc:handle_answer httpc.erl:636 が表示されます。