Ejabberd从20.07迁移至23.04后IQ路由处理失败问题咨询
Ejabberd 20.07迁移至23.04后IQ请求处理失败问题(privacy/ping等模块)
问题现象
将Ejabberd从20.07版本升级到23.04后,mod_privacy、mod_ping、mod_mix_pam模块均无法处理ejabberd_route IQ请求。例如在PSI+中发送以下IQ请求:
<iq type="get" id="aad6a"><query xmlns="jabber:iq:privacy"/></iq>
服务端返回函数匹配失败错误,错误日志如下:
2023-03-21 12:44:21.820818+05:30 [error] <0.1269.0>@gen_iq_handler:process_iq/4:116 Failed to process iq: #iq{id = <<"aad6a">>,type = get,lang = <<"en">>, from = #jid{user = <<"userid">>,server = <<"localhost">>, resource = <<"Mobile-123">>,luser = <<"userid">>, lserver = <<"localhost">>,lresource = <<"Mobile-123">>}, from_jid = undefined, to = #jid{user = <<"userid">>,server = <<"localhost">>, resource = <<>>,luser = <<"userid">>, lserver = <<"localhost">>,lresource = <<>>}, sub_els = [#xmlel{name = <<"query">>, attrs = [{<<"xmlns">>,<<"jabber:iq:privacy">>}], children = []}], meta = #{ip => {0,0,0,0,0,0,0,1}}} ** exception error: no function clause matching mod_privacy:process_iq({iq,<<"aad6a">>,get,<<"en">>, {jid,<<"userid">>, <<"localhost">>,<<"Mobile-123">>, <<"userid">>,<<"localhost">>, <<"Mobile-123">>}, undefined, {jid,<<"userid">>, <<"localhost">>,<<>>, <<"userid">>,<<"localhost">>, <<>>}, [{privacy_query,[],undefined, undefined}], #{ip => {0,0,0,0,0,0,0,1}}}) (src/mod_privacy.erl, line 126) in function gen_iq_handler:process_iq/3 (src/gen_iq_handler.erl, line 131) in call from gen_iq_handler:process_iq/4 (src/gen_iq_handler.erl, line 109) in call from ejabberd_sm:route/1 (src/ejabberd_sm.erl, line 146) in call from ejabberd_router:do_route/1 (src/ejabberd_router.erl, line 399) in call from ejabberd_router:route/1 (src/ejabberd_router.erl, line 92) in call from ejabberd_c2s:check_privacy_then_route/2 (src/ejabberd_c2s.erl, line 874) in call from xmpp_stream_in:process_authenticated_packet/2 (src/xmpp_stream_in.erl, line 727)
问题原因
Ejabberd在20.07到23.04版本之间对XMPP数据包处理API做了重构,其中IQ请求的处理函数签名发生了变更。错误日志显示,当前mod_privacy模块的process_iq函数无法匹配新版本传递的参数结构——旧版本的函数参数格式与23.04版本的参数封装方式不兼容,导致函数子句匹配失败。
解决方案
- 使用官方适配版本的模块:确保使用的mod_privacy、mod_ping等模块是Ejabberd 23.04官方发布的版本,第三方自定义模块需要同步更新。
- 调整模块函数签名:对比Ejabberd 23.04官方
mod_privacy.erl中的process_iq函数定义,修改自定义模块的函数参数以匹配新版本要求。例如新版本可能将参数从原始记录结构改为映射(#{})类型,或调整了字段顺序/名称。 - 检查路由配置:验证ejabberd.yml中的路由规则,确保IQ请求被正确路由到对应模块,避免配置错误导致的参数传递异常。
- 清理缓存并重启服务:升级后删除Ejabberd的缓存文件,完全重启服务,避免旧版本模块代码残留影响运行。
内容的提问来源于stack exchange,提问作者Venkateshwaran Kathiresan K
相关产品推荐
相关产品推荐

