钩子(Hook) 采用职责链设计模式( ),扩展模块或插件向钩子注册回调函数,系统在客户端上下线、主题订阅或消息发布确认时,触发钩子顺序执行回调函数:
不同钩子的回调函数输入参数不同,用户可参考插件模版的 emqx_plugin_template (opens new window) 模块,每个回调函数应该返回:
返回 | 说明 |
---|---|
ok | 继续执行 |
{ok, NewAcc} | 返回累积参数继续执行 |
stop | 停止执行 |
{stop, NewAcc} | 返回累积参数停止执行 |
提供了全部钩子的使用示例,例如端到端的消息处理回调:
-export([load/1, unload/0]).
-export([on_message_publish/2, on_message_deliver/3, on_message_acked/3]).
emqx:hook('message.publish', fun ?MODULE:on_message_publish/2, [Env]),
emqx:hook('message.deliver', fun ?MODULE:on_message_deliver/3, [Env]),
on_message_publish(Message, _Env) ->
io:format("publish ~s~n", [emqx_message:format(Message)]),
{ok, Message}.
on_message_deliver(Credentials, Message, _Env) ->
{ok, Message}.
on_message_acked(Credentials, Message, _Env) ->
io:format("client ~s acked: ~s~n", [Credentials, emqx_message:format(Message)]),
{ok, Message}.
unload() ->
emqx:unhook('message.publish', fun ?MODULE:on_message_publish/2),
emqx:unhook('message.acked', fun ?MODULE:on_message_acked/3),