2016-06-19 4 views
0

Ejabberd(バージョン16.04)とSmackクライアントライブラリ(Androidでは4.17)に基づくXmppスタックがあります。Xmppメッセージが落とされました:ストリーム再開後にスマックが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にメッセージを送信する - クライアントAは

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(無線LANが切断またはアプリが殺される)uncleanly切断されています

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)を有効にしようとしましたが、機能しません。 My 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を追加していました。

ChatMessageListenerを使わずにejabberdがメッセージを正しく再送信していても、それらのメッセージが適切にアックされていないか、クライアント側のデータベースに格納されていませんでした。

関連する問題