我在 ejabberd 的 gen_mod 行为之后添加了一些模块来实现我的私有服务,并在这些模块中添加了一些钩子。这在大多数情况下都很好用。
ejabberd_hooks:add(unset_presence_hook, Host,
?MODULE, unset_presence_hook, 10),
但是当我调用 ejabberdctl stop 时,ejabberd 执行以下代码,我发现
gen_mod:stop_modules()
之前已经完成broadcast_c2s_shutdown()
,ejabberd_c2s 中的一些钩子,例如“未设置存在钩子”,由于我的模块已关闭,无法执行。
prep_stop(State) ->
ejabberd_listener:stop_listeners(),
gen_mod:stop_modules(),
ejabberd_admin:stop(),
broadcast_c2s_shutdown(),
timer:sleep(5000),
State.
我想知道为什么ejabberd会在关闭c2s进程之前停止模块,或者这个设计的目的是什么?