2012-07-06 3 views
1

stackoverflow questionthis 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, []}, 
.... 

내 코드는 다음과 같다? 모듈이 올바르게 시작되었는지 어떻게 알 수 있습니까?

+0

그냥 생각 해봐. 아마 쉘이 ​​프로세스 목록을 잘라 버렸을 것이다 (이 경우 목록은'...'로 끝날 것이다). 'rp (supervisor : which_children (ejabberd_sup)) '를 호출하면 그것을 볼 수 있습니까? – legoscia

+0

아니, 거기 있지 않습니다 ... 다른 아이디어가 있습니까? – user601836

+0

은 init에서 PID를 출력하므로 무엇을 검색해야하는지 알 수 있습니다. 당신은 start_link를 사용합니다 - 아마도 부모는 죽어 가고 있습니까? – user425720

답변

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). 

희망이 있으면 다른 사람에게도 도움이됩니다.