このスタックオーバーフローの質問とこのチュートリアル シリーズに続いて、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}.
私のアプローチに何か問題がありますか?モジュールが正しく開始されていることを確認するにはどうすればよいですか?