如何防止ejabberd客户端重连后接收离线消息?技术求助
解决ejabberd仅向在线用户发送消息的问题
我之前碰到过类似的情况——仅仅注释掉mod_offline模块有时候没法彻底解决离线消息推送的问题,可能是因为ejabberd的缓存或者其他默认模块在起作用。给你几个经过验证的解决方案:
1. 彻底禁用mod_offline模块
别只注释掉配置,要确保模块完全不被加载:
- 打开你的ejabberd配置文件(通常是
ejabberd.yml) - 找到
modules段落,要么直接删除mod_offline这一项,要么明确设置它为禁用:modules: # 其他模块保持不变 mod_offline: false - 修改后必须重启ejabberd服务,重载配置可能无法彻底清除已加载的模块缓存。
2. 添加消息过滤规则,拒绝离线消息
即使禁用了mod_offline,有时候ejabberd还是会尝试路由离线消息,这时候可以通过访问控制规则直接拦截:
在配置文件的access部分新增规则,然后让mod_message使用这个规则:
access: # 新增规则:拒绝向离线用户发送消息 deny_offline: - deny: presence: offline modules: mod_message: # 让消息发送遵循这个规则 access_send: deny_offline
这样当接收者处于离线状态时,消息会被直接拒绝发送,发送方(客户端A)会收到发送失败的反馈,而客户端B上线后不会收到这条离线消息。
3. 检查并禁用消息归档模块(mod_mam)
如果你的ejabberd启用了mod_mam(消息归档),它可能会自动存储所有消息,当用户上线时同步这些归档内容。如果不需要这个功能,可以禁用它:
modules: mod_mam: false
或者配置它仅存储在线时的消息:
modules: mod_mam: default: never # 默认不归档任何消息
测试步骤
- 重启ejabberd服务确保配置生效
- 保持客户端A在线,客户端B离线
- 客户端A发送消息“hello”给B
- 客户端B重新连接ejabberd
- 检查B是否收到消息——正常情况下应该不会收到,同时A会看到消息发送失败的提示
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

