EjabberD MAM归档消息丢失求助:重新登录后归档消息被删除
解决Ejabberd MAM归档消息退出登录后丢失的问题
看起来你遇到的核心问题是Ejabberd的MAM归档在用户退出后被自动清理了,结合你的配置(LDAP+匿名认证)和当前的MAM设置,我整理了几个关键的遗漏配置点和排查方向:
1. 给mod_mam加上持久化存储的明确配置
你已经开了default: always让消息归档,但默认情况下mod_mam可能只是把消息存在内存里,尤其是匿名用户的会话。得在ejabberd.yml里给mod_mam补全存储相关的参数:
mod_mam: default: always store_messages: true # 明确开启消息落地存储 persistent: true # 强制把归档写入磁盘的Mnesia库 assume_mam_usage: true # 让所有会话都走MAM归档,避免漏存
2. 给匿名用户配置归档保留策略
你的认证包含匿名方式,而Ejabberd默认会在匿名用户断开后删掉他们的所有数据——包括MAM归档。得在host_config里给匿名用户加个“免删”配置:
host_config: "x.x.x.x": auth_method: - anonymous - ldap allow_multiple_connections: false # 新增这两行,保留匿名用户的归档数据 anonymous_protocol: login anonymous_user_expire: 0 # 设为0表示永不删除匿名用户的账户和归档 # 同时给这个主机单独指定MAM配置,确保生效 mod_mam: default: always store_messages: true persistent: true
3. 检查有没有自动清理归档的配置
看看你的ejabberd.yml里有没有开mod_purge这类自动清理模块,另外检查mod_mam里有没有设置expire_after参数——这个参数会定时删掉旧归档,如果有的话要么移除,要么设为0(表示永不清理):
mod_mam: # 确保没有下面这种自动清理的配置,如果有就删掉或者改成expire_after: 0 # expire_after: 86400
4. 验证LDAP用户的归档存储权限
对于LDAP登录的用户,要确保Ejabberd为他们创建了持久化的用户条目,并且mod_mam有权限写入归档。你可以通过Mnesia的转储文件检查archive表有没有对应用户的记录,或者查看ejabberd的日志,看看有没有存储失败的报错信息。
小建议:优化客户端登出逻辑
你的Strophe登出代码本身没问题,但可以在登出前先发送一个离线状态包,让Ejabberd更稳妥地处理会话结束:
// 先发送离线状态 connection.send($pres({type: "unavailable"})); // 延迟一下再断开,确保状态包发送完成 setTimeout(() => { connection.disconnect(); connection.reset(); }, 500);
调整完这些配置后,重启Ejabberd测试一下,应该就能实现消息的永久归档,重新登录后也能检索到历史消息了。
内容的提问来源于stack exchange,提问作者Madhavan Malolan
相关产品推荐
相关产品推荐

