offline_message_hook:发送离线消息时不被调用

Posted

技术标签:

【中文标题】offline_message_hook:发送离线消息时不被调用【英文标题】:offline_message_hook: does not get called when one sends an offline message 【发布时间】:2013-02-28 10:04:27 【问题描述】:

我正在开发使用 ejabberd 作为 XMPP 服务器的 android 聊天应用程序。我想在用户离线时发送 GCM 推送通知。为此,我在 ejabberd 中创建了新模块,注册了 offline_message_hook,但是只有当有人开始输入并完成输入时才会调用此函数。以下是传递给此钩子的唯一数据包。虽然,用户在他/她上线时会收到消息。

Packet: xmlelement,
      "message",
      ["type",
       "chat",
      "id",
       "purple7d4d0773",
      "to",
       "xxx@rakshith"],
      [xmlelement,
       "paused",
       ["xmlns",
         "http://jabber.org/protocol/chatstates"],
       []]
Packet: xmlelement,
      "message",
      ["type",
       "chat",
      "id",
       "purple7d4d0773",
      "to",
       "xxx@rakshith"],
      [xmlelement,
       "composing",
       ["xmlns",
         "http://jabber.org/protocol/chatstates"],
       []]

【问题讨论】:

嗨,你能分享你的 gcm 模块吗? 嗨@TolgayToklar,我现在没有实际的实现。但是,您可以使用offline hook in ejabberd 实现GCM push。希望有帮助! 你在哪里存储 android 设备令牌? @TolgayToklar 使用 ejabberd 归档模块可以归档所有消息,您可能需要扩展模块或者您可以编写自己的模块。在任何情况下,归档模块都可以更深入地了解如何使用数据库。 【参考方案1】:

关于 ejabberd 中的钩子的两件事: 1)回调总是按顺序调用,顺序由您在注册时指定的优先级定义。 2) 如果回调返回“停止”,它会阻止事件传播到链上的其他侦听器。

发生的事情是 ejabberd 离线模块正在侦听 offline_message_hook,这与您的代码相同。它处理消息并返回“停止”,因此您的代码不会被执行。

(您的代码确实会收到有关聊天状态通知的消息,因为这些消息会被离线模块忽略,因此在这些情况下它不会停止链)。

您可能希望您的代码离线存储模块之前运行。请记住不要返回“停止”,以便离线模块有机会存储消息。

【讨论】:

谢谢,目前订单是50个,我改成1个告诉你。 BTW 离线模块的默认顺序是什么? mod_offline 也将自己注册为 50。如果使用相同的优先级,先调用哪个是未定义的(目前考虑模块名称和函数回调,但最好考虑未定义的情况) 感谢您的建议,是的,如果订单更改为 1,它就像魅力一样。 :D

以上是关于offline_message_hook:发送离线消息时不被调用的主要内容,如果未能解决你的问题,请参考以下文章

为啥重新连接成功时socket.io客户端会发送离线消息?

如何在 xmpp smack 或 asmack 中将文件发送给离线用户?

用户离线时Openfire发送推送通知

网络推送。获取离线时发送的网络推送?

java websocket上线后如何发送离线用户的消息?

如何在有在线交易时向离线应用发送通知