1
继此stackoverflow question和this 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}.
有什么事在我的做法?我怎样才能确保模块正确启动?
只是一个想法:也许shell截断了进程列表(在这种情况下列表将以'... ...结束)。你可以看到它,如果你打电话给'rp(主管:which_children(ejabberd_sup))'? – legoscia 2012-07-06 16:39:58
不,它不存在...你有其他想法吗? – user601836 2012-07-06 20:04:45
在init中打印PID,所以你知道要寻找什么。你使用start_link - 也许父母快死了? – user425720 2012-07-09 03:50:09