2012-07-06 62 views
1

继此stackoverflow questionthis tutorial series之后,我实现了mod_test模块,它实现了gen_mod和gen_server行为。现在它非常愚蠢,因为它只不过是将自己添加到ejabber_sup中。ejabberd gen_mod开发问题

我的问题是,我不知道该模块是否被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

只是一个想法:也许shell截断了进程列表(在这种情况下列表将以'... ...结束)。你可以看到它,如果你打电话给'rp(主管:which_children(ejabberd_sup))'? – legoscia 2012-07-06 16:39:58

+0

不,它不存在...你有其他想法吗? – user601836 2012-07-06 20:04:45

+0

在init中打印PID,所以你知道要寻找什么。你使用start_link - 也许父母快死了? – user425720 2012-07-09 03:50:09

回答

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

希望这将帮助其他人也是如此。