2016-06-19 2 views
0

У меня есть Xmpp-стек на основе Ejabberd (версия 16.04) и клиентская библиотека Smack (4.17 на Android).Xmpp Сообщение сброшено: Smack не отправляет ACK после возобновления потока

Я столкнулся с ситуацией, когда сообщения, отправленные сервером, удаляются, когда клиент временно отключается. Вот шаги, которые я использую для репликации ситуации, а также журналы из ejabberd.

1- Клиент А идет онлайн

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 не отправляет правильные файлы для сообщений после повторного подключения. Я попытался включить Stream Management (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 эти сообщения не были надлежащим образом сохранены или сохранены в базе данных на стороне клиента.

 Смежные вопросы

  • Нет связанных вопросов^_^