5

new Thread(r).start()ファイルのアップロードを処理するサーブレットにリクエストが届いたら、アップロードされたファイルに付属する別のデータを処理するサーブレットを使用して、そのサーブレットで新しいスレッドを開始することをお勧めします。両方のジョブを並行して処理するために、これが必要でした。

4

3 に答える 3

18

それは悪い考えであるだけでなく、うまくいきません。理由は次のとおりです。ファイル アップロード リクエストは最終的にdoPost()メソッドにヒットします。この方法を使用している限り、コンテナーは接続を開いたままにします。そのメソッドから戻ると (着信データを別のスレッドで処理することにした場合は、doPost()早期に終了します)、コンテナーは要求が完了したと見なし、接続を閉じます。クライアントから見ると、アップロードはサーバーによって中断されました。また、スレッドの非同期性により、割り込みはランダムな瞬間に発生します。

私を信じてください、一部のユーザーはすでにそれを経験しています: HttpServletResponse は定期的に時期尚早に送信するようです

さらに、リクエストごとに新しいスレッドを開始することは、スケーリングが不十分であるため、悪い考えです (仕様によっては禁止されています)。できることは、Servlet 3.0 非同期リクエストを使用してアップロードを非同期に処理することですが、スレッドのプールを使用することをお勧めします。参照:サーブレット スレッドで作業する代わりに、startAsync で新しいスレッドを作成する理由 .

于 2012-04-26T08:56:44.583 に答える
-2

サーブレットは Web サーバーによって新しいスレッドで暗黙的に実行されるため、リクエストがサーブレットにヒットすると、別のスレッドで実行されます。自分で新しいスレッドを作成する理由が見当たらない

于 2012-04-26T08:56:05.423 に答える
-5

(EJB とは異なり) サーブレットで新しいスレッドを開始することに何の問題もないので、はい、問題ありません。

編集:@Tomasz Nurkiewiczが正しいと考え直しました。ファイルのアップロードが停止されます。

于 2012-04-26T08:53:25.713 に答える