ヒッチハイカー:
(Tomcatのに基づいて)私の春ブーツ2.1.6プロジェクトで、私は残りのコントローラを持っています。私は何かを印刷し、それにデフォルトコンストラクタを追加しました。私は、各要求は別々のスレッドで処理されるのTomcatベースのサーバーに思いました。私は新しいコントローラオブジェクトをトリガするために各要求を期待ように、コンストラクタの結果、新しい印刷など。しかし、私は残りのコントローラに30件のリクエストを送信し、私は唯一の印刷が一度行われたことを確認するテストを行いました。だから、私の知る限り、すべての残りのコントローラハンドル1つのスレッドでこれらの要求を理解して。
私の質問は、実際に複数の要求がシングルスレッドで処理されているかどうかであるか多分別のスレッドがオープンされる時に、特定の要求のしきい値がありますか?私は、おそらくこれは設定のどこかに制御されているデフォルトの春ブート構成を使用していますか?
これは私のコントローラのコードです:
@RestController
public class TrackingEventController {
public TrackingEventController() {
System.out.println("from TrackingEventController");
}
@RequestMapping(method=GET, path=trackingEventPath)
public ResponseEntity<Object> handleTrackingEvent(
@RequestParam(name = Routes.event) String event,
@RequestParam(name = Routes.pubId) String pubId,
@RequestParam(name = Routes.advId) String advId) {
return new ResponseEntity<>(null, new HttpHeaders(), HttpStatus.OK);
}
}
JB Nizet:
あなたは、2つの直交概念を混合しています:
- スレッド
- コントローラインスタンス
単一のスレッドが作成および/または1つ、または複数のコントローラのインスタンスを使用することができます。
複数のスレッドが作成および/または1つ、または複数のコントローラのインスタンスを使用することができます。
2は無関係です。
そして、どのようにそれが実際に動作しています
- 春の豆は、デフォルトでシングルトンなので、春には、お使いのコントローラの単一のインスタンスを作成します
- サーブレットコンテナはスレッドのプールを使用しています。
- 要求が入ってきたびに、スレッドがプールから選択され、このスレッドは、要求を処理します。リクエストがあなたのコントローラにマッピングされている場合には、ユニークなコントローラインスタンスの適切な方法は、このスレッドで実行されます。
あなたが現在のリクエストを処理しているスレッドを知りたい場合は、お使いのコントローラメソッドにこれを追加します。
System.out.println(Thread.currentThread().getName());