new Thread(r).start()
ファイルのアップロードを処理するサーブレットにリクエストが届いたら、アップロードされたファイルに付属する別のデータを処理するサーブレットを使用して、そのサーブレットで新しいスレッドを開始することをお勧めします。両方のジョブを並行して処理するために、これが必要でした。
3 に答える
それは悪い考えであるだけでなく、うまくいきません。理由は次のとおりです。ファイル アップロード リクエストは最終的にdoPost()
メソッドにヒットします。この方法を使用している限り、コンテナーは接続を開いたままにします。そのメソッドから戻ると (着信データを別のスレッドで処理することにした場合は、doPost()
早期に終了します)、コンテナーは要求が完了したと見なし、接続を閉じます。クライアントから見ると、アップロードはサーバーによって中断されました。また、スレッドの非同期性により、割り込みはランダムな瞬間に発生します。
私を信じてください、一部のユーザーはすでにそれを経験しています: HttpServletResponse は定期的に時期尚早に送信するようです
さらに、リクエストごとに新しいスレッドを開始することは、スケーリングが不十分であるため、悪い考えです (仕様によっては禁止されています)。できることは、Servlet 3.0 非同期リクエストを使用してアップロードを非同期に処理することですが、スレッドのプールを使用することをお勧めします。参照:サーブレット スレッドで作業する代わりに、startAsync で新しいスレッドを作成する理由 .
サーブレットは Web サーバーによって新しいスレッドで暗黙的に実行されるため、リクエストがサーブレットにヒットすると、別のスレッドで実行されます。自分で新しいスレッドを作成する理由が見当たらない
(EJB とは異なり) サーブレットで新しいスレッドを開始することに何の問題もないので、はい、問題ありません。
編集:@Tomasz Nurkiewiczが正しいと考え直しました。ファイルのアップロードが停止されます。