在stackoverflow question和this tutorial series之后,我实现了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}.
我的方法有问题吗?如何确保模块正确启动?
答案 0 :(得分:0)
我重新安装了ejabberd(vsn 2.1.11),现在它正在运行。 我在这个答案中添加了与questoin中的代码不同的代码部分。在mod_echo.erl
之后进行了更改-define(PROCNAME, ejabberd_mod_test).
start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
start(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
ChildSpec =
{Proc,
{?MODULE, start_link, [Host, Opts]},
temporary,
1000,
worker,
[?MODULE]},
supervisor:start_child(ejabberd_sup, ChildSpec).
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:call(Proc, stop),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
希望这也有助于其他人。