Ejabberd:如果在客户端的 resume_timeout 之前发送 Xmpp 消息将被丢弃

Posted

技术标签:

【中文标题】Ejabberd:如果在客户端的 resume_timeout 之前发送 Xmpp 消息将被丢弃【英文标题】:Ejabberd: Xmpp messages get dropped if sent before client's resume_timeout 【发布时间】:2016-06-19 12:23:28 【问题描述】:

我最近在我的 Arch linux 机器上从 github 编译了最新的 ejabberd 代码。我是 ejabberd 的新手,所以我可能犯了一个新手错误。

我遇到了一个问题,即在特定情况下数据包无法到达目标客户端。如果消息是在客户端断开连接但之前客户端的会话由于 resume_timeout 而关闭时发送的。

我已按照此处提到的说明进行操作 https://www.ejabberd.im/faq/tcp ,但我仍然无法处理所有情况。

我的 ejabberd.yml 的相关部分看起来像

listen:
  - 
    port: 5222
    module: ejabberd_c2s
    max_stanza_size: 65536
    resend_on_timeout: true
    resume_timeout: 60
    shaper: c2s_shaper
    access: c2s

  - 
    ## Not sure if resend_on_timeout is required here
    port: 5280
    module: ejabberd_http
    resend_on_timeout: true
    resume_timeout: 60
    http_bind: true

modules:
  ...
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_ping:
    send_pings: true
    ping_interval: 60
    timeout_action: kill

这是与客户端活动对应的 ejabberd 日志的输出:

    客户端 A 不干净地断开连接

    2016-06-19 10:59:51.369 [info] <0.549.0>@ejabberd_c2s:fsm_next_state:2454 Waiting for resumption of stream for 9739937980@gappi.in/Smack`
    

    客户端 B 登录并向 A 发送消息

    2016-06-19 11:00:00.320 [info] <0.510.0>@ejabberd_listener:accept:333 (#Port<0.19876>) Accepted connection 139.162.34.247:41186 -> 139.162.34.247:5222
    2016-06-19 11:00:00.575 [info] <0.559.0>@ejabberd_c2s:wait_for_sasl_response:900 (socket_state,fast_tls,tlssock,#Port<0.19876>,#Port<0.19877>,<0.558.0>) Accepted authentication for echo by undefined from 137
    2016-06-19 11:00:00.715 [info] <0.559.0>@ejabberd_c2s:open_session:1111 (socket_state,fast_tls,tlssock,#Port<0.19876>,#Port<0.19877>,<0.558.0>) Opened session for echo@gappi.in/13353511976792329881266
    2016-06-19 11:00:00.776 [info] <0.559.0>@ejabberd_c2s:handle_enable:2700 Stream management with resumption enabled for echo@gappi.in/13353511976792329881266
    2016-06-19 11:00:00.984 [info] <0.559.0>@ejabberd_c2s:terminate:1778 (socket_state,fast_tls,tlssock,#Port<0.19876>,#Port<0.19877>,<0.558.0>) Close session for echo@gappi.in/13353511976792329881266
    

    Client A session 由于 resume_timeout 而最终关闭

    2016-06-19 11:00:51.370 [info] <0.549.0>@ejabberd_c2s:terminate:1778 (socket_state,gen_tcp,#Port<0.19869>,<0.548.0>) Close session for 9739937980@gappi.in/Smack
    

    客户端 A 重新登录

    2016-06-19 11:01:14.078 [info] <0.510.0>@ejabberd_listener:accept:333 (#Port<0.19879>) Accepted connection 122.172.241.21:26597 -> 139.162.34.247:5222
    2016-06-19 11:01:14.707 [info] <0.566.0>@ejabberd_c2s:wait_for_sasl_response:900 (socket_state,gen_tcp,#Port<0.19879>,<0.565.0>) Accepted authentication for 9739937980 by undefined from 122.172.241.21
    2016-06-19 11:01:14.868 [info] <0.566.0>@ejabberd_c2s:open_session:1111 (socket_state,gen_tcp,#Port<0.19879>,<0.565.0>) Opened session for 9739937980@gappi.in/Smack
    2016-06-19 11:01:14.966 [info] <0.566.0>@ejabberd_c2s:handle_enable:2700 Stream management with resumption enabled for 9739937980@gappi.in/Smack
    

根据本指南https://www.ejabberd.im/faq/tcp,在 resume_timeout 到期后,未确认的消息应该由 mod_offline 处理。但这并没有发生。

结果:没有消息到达客户端。

任何指针?

【问题讨论】:

您是否尝试过减少 resume_timeout 超时。让我们尝试将其更改为 20 或将 ping_interval 设置为大于 60。 【参考方案1】:

这个问题是由 Ejabberd https://github.com/processone/ejabberd/issues/1160 中的一个错误引起的,该错误现已修复。

【讨论】:

以上是关于Ejabberd:如果在客户端的 resume_timeout 之前发送 Xmpp 消息将被丢弃的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ejabberd 服务器连接到 Logica opensmpp

我可以创建一个围墙花园,只允许我组织的用户使用我的 ejabberd 实例

如何在 ejabberd 中获取图像的缩略图

如何使用 smack 库从客户端搜索 ejabberd 服务器上的注册用户?

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

Ejabberd,Python:检查用户,如果没有创建