【发布时间】:2018-10-30 23:07:29
【问题描述】:
我刚刚从支持 MySQL 的源代码 (18.04) 安装了 ejabberd,并分别更改了配置文件。基本上一切正常:ejabberd 启动,我可以注册用户,用户可以连接和发送消息。我还看到数据库中的所有用户,所以我认为设置到目前为止是正确的。
现在我想使用 mod mod_mam 来存档所有消息。为此,我在ejabberd.yaml 文件中添加了以下几行:
modules:
...
mod_mam:
db_type: sql
default: always
...
但是,当我发送离线消息时,我收到以下错误 - 实际上,两个函数同时使用离线消息挂钩时出现了两个类似的错误:
[error] <0.541.0>@ejabberd_hooks:safe_apply:383 Hook offline_message_hook crashed when running mod_mam:offline_message/1:
** Reason = {error,function_clause,[{mod_mam,offline_message,[{file,"src/mod_mam.erl"},{line,366}],[ok]},{ejabberd_hooks,safe_apply,[{file,"src/ejabberd_hooks.erl"},{line,380}],4},{ejabberd_hooks,run_fold1,[{file,"src/ejabberd_hooks.erl"},{line,364}],4},{ejabberd_sm,route,[{file,"src/ejabberd_sm.erl"},{line,143}],1},{ejabberd_local,route,[{file,"src/ejabberd_local.erl"},{line,73}],1},{ejabberd_router,do_route,[{file,"src/ejabberd_router.erl"},{line,368}],1},{ejabberd_router,route,[{file,"src/ejabberd_router.erl"},{line,93}],1},{ejabberd_c2s,check_privacy_then_route,[{file,"src/ejabberd_c2s.erl"},{line,823}],2}]}
使用较旧的安装 (17.01) 一切正常。但我不知道是否需要额外的 MySQL 表。当我查看当前数据库时,实际上所有消息(包括离线消息)都存储在表 archive 中。
【问题讨论】:
-
您是仅使用 ejabberd 中包含的模块,还是安装了任何贡献的模块或其他自定义模块?
-
您的问题将我引向了正确的方向。我确实有我自己的使用该钩子的模块。在离线消息的情况下,函数
sent_notification({Action,Packet} = Acc)被调用。但是,我返回ok.如果我返回Acc.,一切似乎都正常。所以我假设我必须为下一个模块传递输入(只是一个猜测,我对 ejabberd/erlang 不是很熟悉)。我确定我的模块与 ejabberd 17.01 一起使用,当时签名必须为sent_notification(From, To, Packet)并返回ok.有效。如果你提供这个作为答案,我可以接受。
标签: xmpp ejabberd ejabberd-module ejabberd-hooks