7

STOMPクライアントを使用してRabbitMQと通信するiOSアプリケーションがあります。アプリケーションは起動時に多くの状態をロードし、STOMPで公開された更新を受信することでその状態の同期を維持します。もちろん、接続が失われると、同期していることを確認できなくなるため、その大きな初期BLOBを再ロードする必要があります。あらゆる種類のネットワークの中断がこの動作を引き起こし、顧客を悲しませます。

これを修正するための大局的な方法はたくさんあります(そして私はそれらに取り組んでいます)が、それまでの間、私はこの問題を解決するために永続キューを使用しようとしています。サーバーがキューを作成し、それを適切なトピックにバインドしてから、大規模なスタートアップバンドルの構築を開始するという考え方です。終了すると、すべてがクライアントに渡されます。クライアントはスタートアップバンドルを設定し、キューへのサブスクリプションを開いてから、サーバーの準備中に発生した更新を処理します。同様に、クライアントが切断された場合、クライアントは単に再接続して、キューで見つけたメッセージの読み取りを再開できます。

私の問題は、クライアントが接続後に送信されたメッセージを正常に受信している間、接続する前にキューにメッセージがあった場合、それらは読み取られないことです。同様に、クライアントが切断された場合、再接続すると、クライアントが離れている間に到着したメッセージは表示されません。

誰かが私がクライアントにそれらの行方不明のメッセージを読めるようにする方法を提案できますか?

4

1 に答える 1

6

何が起こっていたのかは、STOMPアダプターがメッセージを消費していたが、それらを配信できなかったことが判明しました。したがって、クライアントが再接続したとき、クライアントはそれを待機しているメッセージを持っていません。

この問題を修正するために、サブスクライブ要求の「ack」設定を「client」に変更しました。これは、クライアントがACKフレームを送り返すまで、STOMPが配信されたメッセージを考慮しないことを意味します。クライアントを適切に変更することで、クライアントが不在になった後でもメッセージが配信されるようになりました。

于 2013-02-21T02:33:28.180 に答える