2016-06-19 117 views
0

我有基于Ejabberd(版本16.04)和Smack客户端库(Android上的4.17)的Xmpp堆栈。Xmpp消息丢失:Smack在流恢复后不发送ACK

我正面临一种情况,即当客户端暂时脱机时,服务器发送的消息将被丢弃。以下是我用来复制情况的步骤以及来自ejabberd的日志。

1-客户端A上线

2016-06-19 01:22:59.834 [info] <0.505.0>@ejabberd_listener:accept:333 (#Port<0.19955>) Accepted connection 122.172.241.21:26683 -> 139.162.34.247:5222 
2016-06-19 01:23:00.449 [info] <0.667.0>@ejabberd_c2s:wait_for_sasl_response:900 ({socket_state,gen_tcp,#Port<0.19955>,<0.666.0>}) Accepted authentication for 9739937980 by undefined from 122.172.241.21 
2016-06-19 01:23:00.619 [info] <0.667.0>@ejabberd_c2s:open_session:1111 ({socket_state,gen_tcp,#Port<0.19955>,<0.666.0>}) Opened session for [email protected]/Smack 
2016-06-19 01:23:00.698 [info] <0.667.0>@ejabberd_c2s:handle_enable:2700 Stream management with resumption enabled for [email protected]/Smack 

2 - 客户端A被断开不清洁(WIFI断线或应用程序被杀害)

2016-06-19 01:27:57.582 [info] <0.667.0>@ejabberd_c2s:fsm_next_state:2454 Waiting for resumption of stream for [email protected]/Smack 

3 - 其他客户机/机器人将消息发送到客户端A

4 - 客户A短时间后重新联机(60秒)

2016-06-19 01:28:39.367 [info] <0.505.0>@ejabberd_listener:accept:333 (#Port<0.19963>) Accepted connection 122.172.241.21:26543 -> 139.162.34.247:5222 
2016-06-19 01:28:40.050 [info] <0.684.0>@ejabberd_c2s:wait_for_sasl_response:900 ({socket_state,gen_tcp,#Port<0.19963>,<0.683.0>}) Accepted authentication for 9739937980 by undefined from 122.172.241.21 
2016-06-19 01:28:40.213 [info] <0.684.0>@ejabberd_c2s:open_session:1111 ({socket_state,gen_tcp,#Port<0.19963>,<0.683.0>}) Opened session for [email protected]/Smack 
2016-06-19 01:28:40.214 [info] <0.667.0>@ejabberd_c2s:terminate:1758 ({socket_state,gen_tcp,#Port<0.19955>,<0.666.0>}) Replaced session for [email protected]/Smack 
2016-06-19 01:28:40.215 [info] <0.667.0>@ejabberd_c2s:handle_unacked_stanzas:2872 2 stanzas were not acknowledged by [email protected]/Smack 
2016-06-19 01:28:40.302 [info] <0.684.0>@ejabberd_c2s:handle_enable:2700 Stream management with resumption enabled for [email protected]/Smack 

现在,这里ejabberd告诉我,它尚未收到对未决消息的确认 2 stanzas were not acknowledged by [email protected]/Smack。此外,这些消息不被Smack库接收并被丢弃。

很明显,Smack客户端库在重新连接后没有为消息发送适当的消息。我试过在我的客户端库代码中启用流管理(XEP-198),但它不起作用。我的Smack客户端连接代码如下所示:

XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration 
      .builder(); 
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
config.setServiceName(serverAddress); 
config.setHost(serverAddress); 
config.setPort(5222); 
config.setDebuggerEnabled(true); 
XMPPTCPConnection.setUseStreamManagementDefault(true); 
XMPPTCPConnection.setUseStreamManagementResumptionDefault(true); 
connection = new XMPPTCPConnection(config.build()); 
connection.setUseStreamManagement(true); 
connection.setUseStreamManagementResumption(true); 

我需要什么更改才能避免这些丢弃的消息?

感谢。

回答

1

我想出了自己。

我的客户端代码中存在一个错误。我很晚才将ChatMessageListener添加到连接中。

因此,尽管ejabberd正在重新正确地重新发送邮件,但没有ChatMessageListener这些邮件没有被正确收录或存储到客户端数据库。