2010-11-23 13 views
5

私はTomcat 7.0.4で新しいServlet 3.0非同期機能を使っています。私はクライアントがGET要求でハングアップしてメッセージの更新を得ることを可能にするこのChat Applicationを見つけました。これは、メッセージの受信に関してはうまくいきます。クライアントが接続を閉じたかどうかを知る方法

クライアントが切断された、つまりユーザーがブラウザを閉じると、問題が発生します。クライアントが切断されていても、サーバはIOExceptionを上げていないようです。メッセージスレッド(上のリンクのソースコードを参照)は、保存されたすべてのAsyncContextの出力ストリームにうれしく書いています。

これはTomcatのバグですか?または私はここに何かを逃していますか?これがバグでない場合は、クライアントが接続を閉じたかどうかをどのように検出するのですか?

答えて

1

44行であっコード - 47はそれの世話をされ、ここで

} catch(IOException ex) { 
    System.out.println(ex); 
    queue.remove(ac); 
} 

そして

あまりにも75時 - タイムアウトthingieを使用して83、、

req.addAsyncListener(new AsyncListener() { 
    public void onComplete(AsyncEvent event) throws IOException { 
     queue.remove(ac); 
    } 

    public void onTimeout(AsyncEvent event) throws IOException { 
     queue.remove(ac); 
    } 
}); 

EDIT:取得した後もう少し洞察力。

  1. Tomcat 7.0.4はまだベータ版です。だから、そのような振る舞いを期待することができます
  2. 私は努力しましたが、setAsyncTimeout()という方法を見つけることができませんでした。herehereもありません。したがって、私はいくつかの未知の正当な理由のため、最終バージョンで完全に削除したと思います。
  3. この例では、Servlet 3.0 Async APIを待つのではなく、「なぜフレームワークを使用すべきですか?最終的なものの前に書かれたことを推測するもの

これらの事実をすべて組み合わせた後、ある意味で壊れているものを扱おうとしています。それはまた、異質で奇妙な結果の理由かもしれません。

+0

書き込み操作によって発生していないIOExceptionが発生した場合は、それが処理されます。したがって、ブラウザを閉じてその例外を得ることはできません。タイムアウトはこの例では10分です。あなたが何百ものクライアントを言うことができれば、それはかなり大変です。 – SS3

+0

Glassfish v3でコードを試しましたが、FirefoxでonErrorイベントが発生するようですが、IEでは動作しません。これは本当に奇妙です。 – SS3

+0

@ SS3:Firefoxに問題はないと言えますか? –

関連する問題