2012-01-08 9 views
0

申し訳ありませんが、これは、文書化する一方に沿って..ですJ2ME永続HttpConnectionを

OLD SETUP

私は3秒間隔でサーバに接続するJ2MEクライアントアプリを持っています。接続は別のスレッドで処理されます。スレッドには、whileループで実行され、次のように行います:

  1. オープンHTTP接続
  2. は3秒
    を繰り返し処理するためのメインUIスレッドへ
  3. スリープを送るレスポンス&を受信

サーバーはApacheであり、KeepAliveはオフです。クライアントからのHTTP要求のタイムアウトは10秒です。各ループには約4.5秒(合計レイテンシは1.5秒)かかります。

低いカバレッジ(低3G/GPRS信号)のたびに頻繁に(1,2時間に1回)、スレッドはIOブロックを受信し、上記のステップ1でハングします。私は起こっていることは、回線のどこかで接続が壊れていると思うが、アプリケーションはそれを知らず、応答を待っている。ネットワーク(この場合はO2)は私が思うと非難することです。接続は30分も生き残ってしまい、結局死んでアプリに-1レスポンスの長さを返し、スレッドは結局続行します。この比較的まれな問題に対処するために、応答が60秒以上かかるとスレッドを放棄して新しいスレッドを作成しました。

最近まで、これは大きな問題ではありませんでしたまでは次のように、しかし、我々は我々のネットワーク設定を変更:


NEW SETUP

  1. を、より低い帯域幅の制限のために、私たちは、間隔を鈍化しました〜5 秒です。
  2. すべての接続をSSLトンネル経由でサーバーにルーティングします。
  3. クライアントからのHTTP要求は依然として*アプリの10秒のタイムアウトを持って

ループは、これらの変更を完了するまでに約7.5秒(2.5秒レイテンシの合計)を取っていました。待ち時間が増加した理由は、(KeepAliveがオフになっているため)SSLによるハンドシェイクが各単一接続に必要であったためです。我々は、KeepAliveをApacheサーバ上でONに切り替えることを勧めました。これは、1つのハンドシェイクを意味し、その後の要求に対して永続的なHTTP接続を意味します。私たちはこれを行い、ほとんどの場合、接続速度をかなり改善しました。ループは6.5秒になります。

だから我々は今、新しいセットアップのために私たちの設定の変更にこれを追加することができます。

は、HTTPキープアライブは、サーバー上でONに切り替わった
  1. しかし

(持続的なTCP接続に有効にします) 3G/GPRSの貧弱な地域では、スレッドブロッキングの問題はずっと頻繁であり、大きな問題になっています。実際には、カバレッジの悪い領域では、その時間の50%も発生します。私はいくつかの新しいスレッドをフォークすることはできませんアプリを教えてメモリの例外からJavaを受け取った..さらに、良好な3Gエリアでは、今までに起こっていなかったスレッドブロッキングの問題も発生しています。

私ははっきりと永続的なHTTP接続として、このセットアップでは何か間違ったことを行っている、基礎となるTCPは

非常に信頼性がある*私たちは、アプリを再書き込みすることなく、すべてのこれらの変更を管理しますが、10秒のHTTPタイムアウトますアプリを書き直す必要があります。おそらく、このタイムアウトは問題を引き起こしていますか?

ありがとうございました。

答えて

0

誰かが同様の問題を抱えている場合は、KeepAliveTimeoutがここにあります。キープアライブを使用しないで5秒に設定されました。

私はこれを30秒に増やしました。これにより、永続的な接続が効果的に作成され、アプリケーションは現在飛行しています。