Ejabberd源码解读-ejabberd_hooks模块

本文深入探讨ejabberd中的hooks模块,它作为系统钩子,通过ejabberd_hooks:add注册方法来响应特定事件。文章介绍了hooks的启动、添加、删除以及运行过程,包括gen_server进程的启动、ets表的创建、事件行为的绑定和执行策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ejabberd 中,hooks 是很重要的一个模块,作为系统hook(钩子),通过调用ejabberd_hooks:add函数,注册一系列方法在ets表hook中,为某些特定事件(event)钩挂相应的行为(action),使在事件(event)发生时,触发对应的所有行为(actions)

1 ejabberd_hooks启动
查看ejabberd_app.erl文件,启动过程语句

%%%启动一个supervisor,并启动和监控定义子进程
    Sup = ejabberd_sup:start_link()

ejabberd_sup:

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
    Hooks =
    {ejabberd_hooks,
     {ejabberd_hooks, start_link, []},
     permanent,
     brutal_kill,
     worker,
     [ejabberd_hooks]},
     ...
     {ok, {
   
   {
   
   one_for_one, 10, 1},
      [Hooks,
       NodeGroups,
       SystemMonitor,
       Router,
       Router_multicast,
       S2S,
       Local,
       Captcha,
       S2SInSupervisor,
       S2SOutSupervisor,
       ServiceSupervisor,
       IQSupervisor,
       FrontendSocketSupervisor,
       Listener]}}.

启动详细参数可以参照supervisor行为规范
ejabberd_hooks:

start_link() ->
    gen_server:start_link({local, ejabberd_hooks}, ejabberd_hooks, [], []).

由上述代码可知ejabberd_hooks启动的是一个gen_sever进程,作为ejabberd_sup子进程存在

init([]) ->
    ets:new(hooks, [named_table]),
    {ok, #state{}}.

gen_server:start_link/4执行后,调用init/1函数新建ets表hooks,用于存储绑定事件行为,存储格式以disco_info为例:

{
   
   {
   
   disco_info,<<"localhost">>},
 [{50,mod_offline,get_info},
  {75,mod_caps,disco_info},
  {100,mod_disco,get_info}]}

2 add hooks
add hooks是需要绑定事件行为(event-action)的模块,通过调用ejabberd_hooks:add和ejabberd_hooks:add_dist函数绑定
add在ejabberd_hooks中定义如下

%%%以下针对不同情况是否包含主机模块等参数匹配不同处理,最终都会调用gen_server:call/2
%%%然后在handle_call回调模块中实现添加
%%% @doc See add/4.
add(Hook, Function, Seq) when is_function(Function) -&g
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值