我有一个进程向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向自己发送“poll”消息。收到此轮询消息后,如果没有暂停,它会点击一个URL并将响应保存到ETS并触发另一个erlang:send_after / 3以在适当的间隔后再次轮询。如果它暂停,它只会触发另一个erlang:send_after?3
所有暂停都将状态设置为paused = true
使用observer,卡住的进程显示当前函数是httpc:handle_answer并且消息队列正在备份
Sate标签:信息“超时” 提示“此过程可能不会处理系统消息”
堆栈跟踪的顶部显示 httpc:handle_answer httpc.erl:636
答案 0 :(得分: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}),并且此消息未来或格式错误。你能检查一下参数和消息队列的值吗?
答案 1 :(得分: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}], []).