2

このスタックオーバーフローの質問このチュートリアル シリーズに続いて、gen_mod と gen_server の両方の動作を実装する mod_test モジュールを実装しました。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)を再インストールしましたが、動作しています。この回答に、クエストのコードとは異なるコードの部分を追加します。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 に答える