- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我最近在我的 Arch Linux 机器上从 github 编译了最新的 ejabberd 代码。我是 ejabberd 的新手,所以我可能犯了一个新手错误。
我遇到了一个问题,即在特定情况下数据包无法到达目标客户端。如果消息是在之后客户端断开连接但之前客户端 session 因 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
这是对应于客户端 Activity 的 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
由于 resume_timeout,客户端 A session 最终关闭
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 处理。但这并没有发生。
结果:没有消息到达客户端。
有什么建议吗?
最佳答案
此问题是由于 Ejabberd 中的错误造成的 https://github.com/processone/ejabberd/issues/1160现在已经修复。
关于android - Ejabberd:如果在客户端的 resume_timeout 之前发送,Xmpp 消息将被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907190/
我最近在我的 Arch Linux 机器上从 github 编译了最新的 ejabberd 代码。我是 ejabberd 的新手,所以我可能犯了一个新手错误。 我遇到了一个问题,即在特定情况下数据包无
我是一名优秀的程序员,十分优秀!