我收到一个奇怪的错误报告,让我认为在 gen_server 初始化之前正在执行一些调用。
这是初始化代码:
init([ResourceId]) ->
process_flag(trap_exit, true),
{ok, {not_initialized, ResourceId}, 0}.
这是应该初始化资源的handle_info。
handle_info(timeout, {not_initialized, ResourceId}) ->
Resource = data_store:get_resource(ResourceId),
{noreply, Resource, ?CACHE_TIMEOUT};
data_store:get_resource(ResourceId) 的返回值为#resouce{} 记录,用于匹配所有的handle_call 方法。
带有函数子句的崩溃报告,因为进程仍未初始化。
=CRASH REPORT==== 1-Feb-2013::14:20:03 ===
crasher:
initial call: gbanga_resources:init/1
pid: <0.11772.0>
registered_name: []
exception exit: {function_clause,
[{gbanga_resources,terminate,
[{function_clause,
[{gbanga_resources,handle_call,
[get_resource,
{<0.11658.0>,#Ref<0.0.0.240914>},
{not_initialized,12697711}],
[{file,"src/gbanga_resources.erl"},
{line,120}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,588}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]},
{not_initialized,12697711}],
[{file,"src/gbanga_resources.erl"},{line,176}]},
{gen_server,terminate,6,
[{file,"gen_server.erl"},{line,722}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]}
in function gen_server:terminate/6 (gen_server.erl, line 725)
ancestors: [gbanga_resources_sup,gbanga_workers_sup,<0.92.0>]
messages: [{'$gen_call',{<0.11638.0>,#Ref<0.0.0.240915>},get_resource},
{'$gen_call',{<0.11633.0>,#Ref<0.0.0.240916>},get_resource}]
links: [<0.6609.0>]
dictionary: []
如果在任何句柄调用之前始终调用句柄信息超时,则永远不会发生这种情况。
有谁知道为什么会这样?