【发布时间】:2016-01-25 06:40:08
【问题描述】:
我有一个模仿 gen_fsm 的 gen_server,(不要问我为什么...),如果没有调用 gen_server:call,gen_server:call 将导致这个 gen_server 从当前状态转移到下一个状态某个时间,gen_server 终止。
更具体地说,gen_server 的生命周期如下所示:
state_1 -> state_2 -> ... -> state_N -> terminated
当服务器处于 state_i 时,如果在此服务器上没有调用 gen_server 调用,则在 t_i 秒后,服务器将进入状态终止,这是通过使用 {reply, Reply, NewState, t_i} 作为 @ 的返回来实现的987654325@.
该方法的问题是,我无法从这个 gen_server 中检索一些信息,为此,我需要对其调用 gen_server:call,这会搞砸超时。
一种可能的解决方法是将最后一个状态转移时间戳放入状态,在每次检索调用后,将新的超时重置为适当的值,原型如下所示:
handle_call(get_a, _From, #state{a = 1,
state = state_2,
%% this is the timestamp when the server transfered to state_2
unixtime = T1
}=S) ->
Reply = S#state.a,
NewTimeout = t_2 - (current_unixtime() - T1),
{reply, Reply, S, NewTimeout};
这样可以得到我想要的效果,但是很丑,有没有更好的办法呢?
【问题讨论】:
标签: erlang