钩子(Hook) 采用职责链设计模式( ),扩展模块或插件向钩子注册回调函数,系统在客户端上下线、主题订阅或消息发布确认时,触发钩子顺序执行回调函数:

    不同钩子的回调函数输入参数不同,用户可参考插件模版的 emqx_plugin_template 钩子(Hook)设计 - 图3 (opens new window) 模块,每个回调函数应该返回:

    返回说明
    ok继续执行
    {ok, NewAcc}返回累积参数继续执行
    stop停止执行
    {stop, NewAcc}返回累积参数停止执行

    提供了全部钩子的使用示例,例如端到端的消息处理回调:

    1. -export([load/1, unload/0]).
    2. -export([on_message_publish/2, on_message_deliver/3, on_message_acked/3]).
    3. emqx:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]),
    4. emqx:hook('message.deliver', fun ?MODULE:on_message_deliver/3, [Env]),
    5. on_message_publish(Message, _Env) ->
    6. io:format("publish ~s~n", [emqx_message:format(Message)]),
    7. {ok, Message}.
    8. on_message_deliver(Credentials, Message, _Env) ->
    9. {ok, Message}.
    10. on_message_acked(Credentials, Message, _Env) ->
    11. io:format("client ~s acked: ~s~n", [Credentials, emqx_message:format(Message)]),
    12. {ok, Message}.
    13. unload() ->
    14. emqx:unhook('message.publish', fun ?MODULE:on_message_publish/2),
    15. emqx:unhook('message.acked', fun ?MODULE:on_message_acked/3),