ejabberd gen_mod发展问题

时间:2012-07-06 12:34:17

标签: erlang ejabberd

stackoverflow questionthis 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}.

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

1 个答案:

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

希望这也有助于其他人。