Я пытаюсь понять, почему мой 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
unknown сообщения, а также cast
сообщений. Теперь моя проблема связана с handle_call
:
- Если я отправлю сообщение, которое соответствует первому случаю, все в порядке, и он отвечает
Когда я отправляю неизвестное сообщение используя, например, gen_server:call(S,xx)
, я получаю ошибку тайм-аута:
исключение exit: {timeout, {gen_server, call, [<0.102.0>, 33]}} в функции gen_server: call / 2 (gen_server .erl, строка 215)
Почему у моего сервера истекло время ожидания? Я вижу, что после handle_call
он входит в handle_info
, но почему он треснет sh?
Использование:
{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