在这个stackoverflow 问题和本教程系列之后,我实现了 mod_test 模块,它实现了 gen_mod 和 gen_server 行为。现在它非常愚蠢,因为它只是将自身添加到 ejabber_sup 中。
我的问题是我不确定该模块是否由 ejabberd_sup 启动,因为我在以下提供的列表中找不到它:
supervisor:which_children(ejabberd_sup).
鉴于我在同一个目录中有 gen_mod.beam 和 mod_test.erl,我使用以下代码编译了我的代码:
erlc -pa ./ mod_test.erl
这没有错误。编译后,我将文件复制到 ejabberd 安装的 ebin 文件夹中,并更改 ejabberd.cfg 添加:
....
{mod_test, []},
....
我的代码如下:
-module(mod_test).
-behaviour(gen_server).
-behaviour(gen_mod).
-export([start/2, stop/1]).
-export([start_link/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-record(state, {}).
start(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
ChildSpec = {Proc,
{?MODULE, start_link, [Host, Opts]},
permanent,
1000,
worker,
[?MODULE]},
supervisor:start_child(ejabberd_sup, ChildSpec).
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?MODULE),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
start_link(_Host, _Opts) ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
init([]) ->
{ok, #state{}}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
我的方法有问题吗?如何确定模块已正确启动?