2

在这个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}.

我的方法有问题吗?如何确定模块已正确启动?

4

1 回答 1

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).

希望这对其他人也有帮助。

于 2012-07-09T12:30:58.597 回答