0

Tomcat を使用してストリーミング リレー サーバーを構築しました。

簡単なアイデアは、1 つのクライアントが POST を実行し、別のクライアントが GET を実行するというものです。サーブレットは Thread から生成され、(POST からの) InputSteam が空になるまで単純なバイト シャッフルを行います。完了したら、両方のリクエストを閉じて応答します。すべて問題なく、完全に機能しますが、

Tomcat は request オブジェクトと InputStream オブジェクトを再利用しているようです! 10 番目の POST ごとに、既に閉じられているため、InputStream を読み取ることができません。ログを詳しく見てみると、以前のリクエストでまったく同じ InputStream オブジェクトが使用された (したがって閉じられた) ことがわかります。HttpServletRequest オブジェクトもまったく同じであることが判明しました。

ここで何が起こっているのですか?Tomcat が明らかに適切にリセットされていないオブジェクトを再利用しているのはなぜですか? バージョン 7.0.29 と 6.0.16 で試しましたが、同じでした。

4

2 に答える 2

1

これはリソース管理の問題であるため(スレッドの保持InputStreamが長すぎる)、次の問題を修正できるはずです。スレッドを起動した(またはタスクを送信したサーブレットをExecutor...これに使用しているExecutor、そうですか?)スレッドが終了する(またはFuture完了する)のを待って、そのリソースを解放します。コードをバイトポンプスレッド(およびサーブレットの関連部分)に投稿すると、それらを改善する方法を紹介できます。

于 2012-08-10T14:02:31.800 に答える
0

アップデート:

私が生成したスレッド(明らかに入力ストリームと出力ストリームへの参照を持っていた)は、それらの参照を常に時間内に解放しないことが判明しました。クリストファー、指摘してくれてありがとう!

これらのオブジェクトをキャッシュすることは非常に悪い習慣であり、絶対に行うべきではないことに同意しますが、Tomcat の反応が非常に悪いのは非常に残念です。その成熟度のアプリサーバーの方が良いと思います...

于 2012-08-08T22:55:13.290 に答える