【发布时间】:2020-08-20 09:44:32
【问题描述】:
我试图弄清楚为什么我的gen_server 会因超时而崩溃,因为我正在处理所有可能的情况:
module(wk).
-behaviour(gen_server).
-compile(export_all).
-record(state,{
limit,
count=0,
toSend
}).
start_link(ToSend,Limit)->
gen_server:start_link(?MODULE, {ToSend,Limit}, []).
init({ToSend,Limit})->
State=#state{toSend=ToSend,limit=Limit},
{ok,State}.
handle_call({process,Message},From,State)->
{reply,{processed,os:timestamp()},State};
handle_call(Message,From,State)->
self() ! {from_call,Message},
{noreply,State}.
handle_cast(Message,State=#state{count=C})->
self() ! {from_cast,Message},
{noreply,State}.
handle_info(Message,State=#state{count=C,limit=L,toSend=T})->
io:format("inside handle_info"),
T! {badrequest,Message},
Ret=if C>L -> {stop,State};
_ ->{noreply,State#state{count=C+1}}
end,
Ret.
如您所见,此服务器可以处理许多 limit 未知消息,以及 cast 消息。
现在我的问题是handle_call:
- 如果我发送一条符合第一种情况的消息,它可以并回复
-
例如,当我使用
gen_server:call(S,xx)发送未知消息时,我收到超时错误:异常退出:函数 gen_server:call/2 中的 {timeout,{gen_server,call,[,33]}}(gen_server.erl,第 215 行)
为什么我的服务器超时?我可以看到handle_call之后进入handle_info但是为什么会崩溃?
用法:
{ok,Y}=wk:start_link(self(),3).
gen_server:cast(Y,some_message). % works limit times and then crashes as expected
Y ! some_message % works limit times and then crashes as expected
gen_server:call(Y,some_message) % gets inside handle_info , since i get the io message, then times out
【问题讨论】:
标签: erlang erlang-otp gen-server