来自 mysql 存档的 ejabberd 同步消息

Posted

技术标签:

【中文标题】来自 mysql 存档的 ejabberd 同步消息【英文标题】:ejabberd syncing message from mysql archive 【发布时间】:2016-05-12 14:12:35 【问题描述】:

我在 ejabberd 上工作了很长一段时间,我正在用内部的 Ejabberd 替换第三方聊天基础设施。因为它是生产切换,所以我们需要在切换到 ejabberd 时维护以前的聊天消息。

所以我创建了所有名册,将用户迁移到 ejabberd,一切正常,现在我面临的主要挑战是消息迁移。我正在为用户、名册和消息使用 mysql。我正在运行一个脚本,该脚本直接将数据从以前的聊天内容推送到 ejabberd mysql。

但是当我连接到用户时,我可以看到通过 ejabberd 发送的新聊天消息,但同一用户的迁移聊天不可见,也不会传播回客户端。

有人可以帮忙吗?

这是我在mysql中放的两个条目,第一个是ejabberd条目,另一个是手动的,客户端可以同步第一个但不能同步另一个。

username    timestamp   peer    bare_peer   xml txt id  kind    nick    created_at
xyz-customer    1454573488523175 abc-provider@xxx.amazonaws.com abc-provider@xxx.amazonaws.com  "<message from='xyz-customer@xxx.amazonaws.com/2131165549e1bc6553-32b9-4ec4-92bd-c9ed80fb5374' to='abc-provider@xxx.amazonaws.com' xml:lang='en' id='oG3Vb-568' type='chat'><body> CnsfjffsjJ</body><thread>90275196-0096-4bb4-a95d-d72ea5238f74</thread><request xmlns='urn:xmpp:receipts'/><delay xmlns='urn:xmpp:delay' stamp='2016-02-04T08:11:27.194+00:00' from='xyz-customer@xxx.amazonaws.com/2131165549e1bc6553-32b9-4ec4-92bd-c9ed80fb5374'/><markable xmlns='urn:xmpp:chat-markers:0'/><request xmlns='urn:urbanclap:request' requestId=''/><active xmlns='http://jabber.org/protocol/chatstates'/></message>"   " CnsfjffsjJ"   208044  chat        "2016-02-04 08:11:28"

xyz-customer    1454570506606317 abc-provider@xxx.amazonaws.com abc-provider@xxx.amazonaws.com  "<message from='xyz-customer@xxx.amazonaws.com' to='abc-provider@xxx.amazonaws.com' xml:lang='en' id='I5sO7-2' type='chat'><body>GB hard</body><request xmlns='urn:xmpp:receipts'/><markable xmlns='urn:xmpp:chat-markers:0'/><active xmlns='http://jabber.org/protocol/chatstates'/></message>"    "GB hard"   208045  chat    NULL    "2016-02-04 07:21:46"

【问题讨论】:

【参考方案1】:

我猜您正在尝试填写邮件存档表,但期望离线邮件传递。请确保您在正确的表格中添加消息。我猜你正在归档表中写入,但应该在假脱机中写入。

请注意,用于传递离线消息的假脱机表仅在新用户登录时检查。这不是一种在运行会话中添加消息以传递给用户的方法。这意味着您不能仅通过写入 MySQL 消息表来真正同步两个正在运行的平台。您需要通过编写自定义 ejabberd 插件来实际路由消息。

【讨论】:

嗨 Mickael,我不是想离线传递,我想将其他平台上的消息推送到 Ejabberd mysql 存档表并执行这些消息以在用户上线时同步。 那么正如我所提到的,在 MySQL 的归档或离线存储中写入消息不会通过 ejabberd 路由消息。您需要编写一个自定义同步插件。 嗨 Mickael,谢谢你的建议,但你能详细说明一下吗,或者你能告诉我要定制哪个特定模块以便从 mod_archive 加载消息,我想如果 mod_archive 表包含所有消息ejabberd 能理解的格式,应该可以正常阅读,我看不懂,是什么限制了 ejabberd 的使用。 不,如果您将 ejabberd 配置为从 MySQL 读取消息,它不会使用 Mnesia。存储仅用于离线或存档消息。它们仅在重新连接以传递脱机消息时读取,或在用户查询 MAM 存档时读取。数据库不是路由消息的来源(没有意义)。 嘿 Mickael,如果是这样的话,ejabberd 甚至无法读取我发送给 mysql 的消息是没有意义的。是什么阻止 ejabberd 阅读我的消息,指定每个字段,创建正确的 xml 字段?这可能是什么原因?如果你说 Mysql 中间不涉及任何人,那为什么消息必须通过 ejabberd ?

以上是关于来自 mysql 存档的 ejabberd 同步消息的主要内容,如果未能解决你的问题,请参考以下文章

ejabberd Mnesia 数据库备份

查询给定用户的存档时出现 503“服务不可用”错误 (mod_mam)

Xcode 8 构建成功但存档失败

来自特定IP的ejabberd注册

即使处于离线状态,Ejabberd 也会归档消息

将 Ejabberd 与 Mysql 连接