ejabberd_sup
ejabberd_sup是ejabberd的进程监视者(),由ejabberd_app创建。
supervisor(监视进程)
supervisor的功能是启动,停止和监控它的子进程。其作用是保持其子进程运行,在必要的时候重启其子进程,例如子进程死掉的时候。
A supervisor is responsible for starting, stopping and monitoring its child processes. The basic idea of a supervisor is that it should keep its child processes alive by restarting them when necessary.
ejabberd_sup负责创建一堆的子进程并监视它们,这些进程有:
ejabberd_hooks,ejabberd_node_groups,ejabberd_system_monitor,ejabberd_router,ejabberd_sm,ejabberd_s2s,ejabberd_local,
ejabberd_listener,ejabberd_receiver_sup,ejabberd_c2s_sup,ejabberd_s2s_in_sup,ejabberd_s2s_out_sup,ejabberd_service_sup,
ejabberd_http_sup,ejabberd_http_poll_sup,ejabberd_frontend_socket_sup,ejabberd_iq_sup,ejabberd_tmp_sup
这些进程大部分也是以sup结尾的supervisor监视进程.
ejabberd_listener
ejabberd_listener是由ejabberd_sup创建的一个supervisor进程,他负责监视和创建一系列的网络端口监听进程。
ejabberd_listener创建的端口监听进程列表是由配置文件中的listen读取的,配置文件样例如下:
{listen,
[
{4222, ejabberd_c2s, [
%%
%% If TLS is compiled and you installed a SSL
%% certificate, put the correct path to the
%% file and uncomment this line:
%%
%%{certfile, "/path/to/ssl.pem"}, starttls,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536}
]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
{5280, ejabberd_http, [
http_poll,
web_admin,
{request_handlers, [{["httpbind"], mod_http_bind},{["pub", "archive"], mod_http_fileserver}]}
]},
{5347, ejabberd_service, [{host, "msn-transport.bucc.cn", [{password, "1j5llz!o"}]}]}
]}.
每个进程的格式如下,{port_no,module_name,[args]}
port_no:端口号,同时也是创建进程时的进程标识
module_name:进程模块名称
args:参数列表
ejabberd_receiver
ejabberd_receiver是一个gen_server进程(behaviour),由ejabberd_socket创建
xml_stream
ejabber_c2s
ejabber_cs2是一个gen_fsm(有限状态机),维护一系列client和server之间的状态。gen_fsm的状态改变是由gen_fsm:send_event(FsmRef, Event)触发的。在ejabberd里,ejabberd_receiver通过xml_stream把事件和xml发送至ejabber_c2s改变其状态。
ejabber_c2s有限状态机的初始状态是wait_for_stream,其余的状态有:
wait_for_auth,wait_for_feature_request,wait_for_sasl_response,wait_for_bind,wait_for_session,session_established
关于帐户免域登录:
将来如果需要添加这个功能,可以修改在ejabberd_c2s的代码实现这个功能,在wait_for_stream状态时,在给客户端发送stream:features的时候附上域名,这样客户端就可以登录的时候附上取得的域了,或者是直接在ejabberd_auth模块实现这个功能?
1 条评论:
想请教你一点关于jabber/xmpp方面的问题, 能加我的Gtalk吗? jessinio (AT) gmail.com
发表评论