stackoverflow question 및 this tutorial series 다음에는 gen_mod 및 gen_server 동작을 모두 구현하는 mod_test 모듈을 구현했습니다. ejabber_sup에 자신을 추가하는 것 이상의 일은 없으므로 지금은 매우 어리 석다.ejabberd gen_mod 개발 문제
내 문제는 내가 목록에서 찾을 수 없기 때문에 모듈이 ejabberd_sup에 의해 시작할지 여부를 확실히 제공하지 오전입니다 : 내가 gen_mod.beam을 가지고 있음을 감안할 때
supervisor:which_children(ejabberd_sup).
mod_test 같은 디렉토리에 .erl을 사용하여 코드를 컴파일했습니다 :
erlc -pa ./ mod_test.erl
이 오류는 발생하지 않습니다. 컴파일 후, 나는 ejabberd 설치 EBIN 폴더에 파일을 복사하고 추가 ejabberd.cfg을 변경 :
-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}.
내 접근 방식에 뭔가 문제인가 :
....
{mod_test, []},
....
내 코드는 다음과 같다? 모듈이 올바르게 시작되었는지 어떻게 알 수 있습니까?
그냥 생각 해봐. 아마 쉘이 프로세스 목록을 잘라 버렸을 것이다 (이 경우 목록은'...'로 끝날 것이다). 'rp (supervisor : which_children (ejabberd_sup)) '를 호출하면 그것을 볼 수 있습니까? – legoscia
아니, 거기 있지 않습니다 ... 다른 아이디어가 있습니까? – user601836
은 init에서 PID를 출력하므로 무엇을 검색해야하는지 알 수 있습니다. 당신은 start_link를 사용합니다 - 아마도 부모는 죽어 가고 있습니까? – user425720