ejabberd mod_echo 解析
(金庆的专栏 2016.8)
按开发入门的说明,mod_echo是最简单的模块之一。
https://docs.ejabberd.im/developer/
当然 mod_hello_world 只有开始和结束日志,没有实际功能,比 mod_echo 更简单。
配置说明一定要看,因为其中有模块功能的简介:
https://docs.ejabberd.im/admin/guide/configuration/#modecho
没看功能简介,直接看代码,结果被 do_client_version/3 给引入了歧途。
echo模块实现了echo功能,向特定域名的用户发送聊天消息,会原样返回。
测试图:
echo域名是可配置的:
modules:
mod_echo:
host: "echo_x.mydomain"缺省为 "echo.@HOST@", 其中@HOST@会被替换成服务器域名。
代码中的 do_client_version/3 演示了 route + receive 发送并收取应答,
但是与echo功能无关,可以忽略该函数。
echo功能是 register_route/2 完成的,
ejabberd_route:register_route(MyHost, Host)表示从Host到MyHost的消息需要本模块来路由。
Host是服务器名,MyHost是配置的mod_echo.host.
可以查看route表:
(ejabberd@localhost)1> ets:tab2list(route).
[{route,<<"pubsub.zt-2203857">>,<<"zt-2203857">>,<0.5500.0>,
undefined},
{route,<<"echox.zt-2203857">>,<<"zt-2203857">>,<0.5492.0>,
undefined},
{route,<<"conference.zt-2203857">>,<<"zt-2203857">>,
<0.5445.0>,undefined},
{route,<<"zt-2203857">>,<<"zt-2203857">>,<0.5406.0>,
{apply,ejabberd_local,route}}]
(ejabberd@localhost)2>
路由消息在 handle_info 中处理,它将来源和目的调换一下,然后调用 route() 发送原包。