1

次のように、一時停止メッセージを 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 が表示されます。

4

2 に答える 2

0

私はgithub erlang otp inets http clientから httpc:handle_answer のコードを選びました:

(注: 関数が 616 行から 631 行に移動するため、これはあなたのものと同じバージョンではありません)

handle_answer(RequestId, false, _) ->
    {ok, RequestId};
handle_answer(RequestId, true, Options) ->
    receive
        {http, {RequestId, saved_to_file}} ->
            ?hcrt("received saved-to-file", [{request_id, RequestId}]),
            {ok, saved_to_file};
        {http, {RequestId, {_,_,_} = Result}} ->
            ?hcrt("received answer", [{request_id, RequestId},
                                      {result, Result}]),
            return_answer(Options, Result);
        {http, {RequestId, {error, Reason}}} ->
            ?hcrt("received error", [{request_id, RequestId},
                                     {reason, Reason}]),
            {error, Reason}
    end.

httpc_manager:request(Request, profile_name(Profile)そのため、プロセスはメッセージ ( {ok, RequestId} を返した への呼び出しの後に来る) を待っていますが、このメッセージが来ないか、形式が間違っています。パラメータの値とメッセージキューを確認できますか?

于 2014-03-05T17:08:43.093 に答える
0

文字列以外の値を含むヘッダーにより、httpc_handler が終了しました。しかしその後、発信者にメッセージが送信されなかったため、発信者は httpc:handle_answer/3 の「受信」で永遠にハングしました。

これでテストできます

Request1= {"http://www.google.com",[{"cookie",undefined}, {"test",123}],"application/x-www-form-urlencoded; charset=utf-8", <<"">>}.
httpc:request(post, Request1, [{timeout,1000}], []).
于 2018-08-27T11:35:52.053 に答える