Erlang ejabberd gen_mod开发问题
接下来,我实现了mod_测试模块,它实现了gen_mod和gen_服务器行为。现在它是非常愚蠢的,因为它除了加入ejabber_sup之外什么都不做 我的问题是,我不确定模块是否由ejabberd_sup启动,因为我在以下提供的列表中找不到它:Erlang ejabberd gen_mod开发问题,erlang,ejabberd,Erlang,Ejabberd,接下来,我实现了mod_测试模块,它实现了gen_mod和gen_服务器行为。现在它是非常愚蠢的,因为它除了加入ejabber_sup之外什么都不做 我的问题是,我不确定模块是否由ejabberd_sup启动,因为我在以下提供的列表中找不到它: supervisor:which_children(ejabberd_sup). 考虑到gen_mod.beam和mod_test.erl在同一个目录中,我使用以下方法编译代码: erlc -pa ./ mod_test.erl 这没有错误。编译后,
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}.
我的方法有问题吗?如何确保模块正确启动?我重新安装了ejabberd(vsn 2.1.11),现在它正在工作。
我在这个答案中添加了代码中与questoin中代码不同的部分。更改如下所示
希望这也能帮助其他人。我重新安装了ejabberd(vsn 2.1.11),现在它可以工作了。
我在这个答案中添加了代码中与questoin中代码不同的部分。更改如下所示
希望这对其他人也有帮助。只是想一想:可能shell截断了进程列表(在这种情况下,列表将以
…
结尾)。如果你调用rp(主管:哪个孩子(ejabberd\u sup))
,你能看到它吗?不,它不在那里……你有其他想法吗?在init中打印PID,这样你就知道要查找什么了。你们使用开始链接——也许家长正在死亡?pid并没有打印出来……但ejabberd_sup还活着,所以我猜mod_测试正在崩溃……但为什么呢?有人能在它的ejabberd中测试它吗?如果你在init()、start_link()和start()中添加一些调试输出,你能看到它们吗?只是一个想法:可能shell截断了进程列表(在这种情况下,列表将以…
结尾)。如果你调用rp(主管:哪个孩子(ejabberd\u sup))
,你能看到它吗?不,它不在那里……你有其他想法吗?在init中打印PID,这样你就知道要查找什么了。你们使用开始链接——也许家长正在死亡?pid并没有打印出来……但ejabberd_sup还活着,所以我猜mod_测试正在崩溃……但为什么呢?有人能在它的ejabberd中测试它吗?如果你在init()中添加一些调试输出,start_link()和start()你看到了吗?
-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).