具有流管理 (XEP-198) 的 Ejabberd 不使用离线消息挂钩

Posted

技术标签:

【中文标题】具有流管理 (XEP-198) 的 Ejabberd 不使用离线消息挂钩【英文标题】:Ejabberd with Stream management (XEP-198) not using offline message hook 【发布时间】:2015-03-02 06:21:02 【问题描述】:

我们正在开发一款具有聊天功能的应用。我们有一个 ejabberd (15.02) 配置为使用 mod_offline_post 使用离线消息挂钩并将离线客户端的所有消息转发到我们自己的 url,然后转发到 GCM。

但是,在我们开发应用程序时,我们还需要启用 XEP-198(流管理)来处理连接丢失。这本身工作正常。创建和恢复流,确认消息。

问题是,jabber 正在等待流恢复并且没有将任何离线消息转发到离线消息挂钩,因此没有转发到我们的 mod 和 post url。当然,它会将它们存储在其离线存储中,并在接收者恢复其流时交付。

有没有办法配置jabber在ejabberd_c2s:fsm_next_state:2517 Waiting for resumption of stream for...时调用离线消息挂钩?

PS:我们在客户端使用 smack 来提供流管理

【问题讨论】:

假设您的客户端尝试保持与服务器建立的 XMPP over TCP 连接,那么您为什么还要使用 GCM 而不是等到客户端重新建立连接? 因为如果应用程序完全关闭,我们仍然希望客户端用户知道他有一条传入消息。单击 GCM 通知将打开应用程序,重新建立连接并传递消息。 您可以使用粘性后台服务,即使您的应用程序没有任何活动在前台,该服务也会运行。 【参考方案1】:

根据我的理解,从 XMPP 规范的角度来看,ejabberd 的行为是正确的。它在做正确的事情,在这种情况下不应该将消息转发到离线商店,因为从技术上讲,您并没有离线。

这不是放置推送处理的正确位置。

【讨论】:

感谢您的回答。我也是这么想的。事实证明,它已经按预期工作了。 Jabber 在 5 分钟的空闲时间后关闭流,然后将所有离线消息转发到我们的推送 URL。如果客户端在该时间之前重新连接,他只是直接从 jabber 离线存储中获取所有消息。所以我太不耐烦了。

以上是关于具有流管理 (XEP-198) 的 Ejabberd 不使用离线消息挂钩的主要内容,如果未能解决你的问题,请参考以下文章

java中如何通过Smack实现流管理?

ejabber 的 erl 文件在 mac os 10.7.5 上运行时给出错误“分段错误:11”

具有事件中心输入流位置的 Azure 流分析

使用授权代码流获取具有有效刷新令牌的新令牌时出错

具有并发输入/输出流的 Java 进程

alsa - 管理非阻塞流