ejabberd を使用する iOS でインスタント メッセンジャー アプリを構築しています。私は現在、ストリーム管理機能と、特にほとんどの場合に機能するように見える再開をテストしています。ただし、設定を考慮して、次の手順で複製できることを理解できない場合があります: resume_timeout: 30, resend_on_timeout: if_offline
- 最初にクライアント A とクライアント B が接続され、他のリソースは接続されていません
- クライアント B がクリーンでない方法でクラッシュまたは切断する
- クライアント A は大量のメッセージ (10 件以上) を非常に迅速に送信し始めます
- ejabberd は、メッセージがサーバーに到達したことを確認するために、送信された各メッセージに対して ack を A に送信します。
- クラッシュから約 20 秒後、B は再接続します。この時点で、A は以前に送信された各メッセージのエラーを受け取ります。
<message xmlns="jabber:client" from="clientB@mydomain" to="clientA@mydomain/resourceID" type="error" id="CFBF4583-209A-4453-2567-CCCC7894827E">
<body>test</body>
<active xmlns="http://jabber.org/protocol/chatstates" />
<request xmlns="urn:xmpp:receipts" />
<error code="503" type="cancel">
<service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
</error>
</message>
ejabberd 16.01で試しました。
これは 80% の確率で発生します。A から送信されたメッセージは、再接続時に 30 秒以内に B に正しく配信されることがあります。
私の質問は次のとおりです。
- この動作は正しいですか?メッセージの ack が既に受信されている場合、クライアント A にエラーが返されないことが期待されます。
- に
resend_on_timeout
設定されてif_offline
おり、他のリソースが接続されていないため、エラーはまったくないと予想されます。私は正しいですか?