私は最近いくつかのコードをテストしていましたが、コントローラーのアクション/メソッドごとに1つのスレッドしか同時にアクティブではなかったことに気づいたときに少し驚きました。例えば、コントローラは、次の2つのアクションを考える:Playフレームワークコントローラのアクションは同期されていますか?
public static void testThread()
{
Logger.info("Start");
try
{
Logger.info("Sleeping...");
Thread.sleep(30000);
}
catch (Exception e)
{
}
Logger.info("End");
}
public static void testThread2()
{
Logger.info("Start");
try
{
Logger.info("Sleeping...");
Thread.sleep(30000);
}
catch (Exception e)
{
}
Logger.info("End");
}
2つのブラウザセッションからtestThread()を呼び出すとは、1つだけが任意の時点で実行されます。第2の要求は、第1の要求が完了するまで待機する。しかし、あるブラウザからtestThread()を呼び出し、別のブラウザからtestThread2()を呼び出すと、期待される結果が得られます。デフォルトのスレッド(play.pool)の数が増えたことを明確にするために、この動作はTomcatでWARとして実行しているときにも存在します。
なぜこのようなことが起こっているのか、またこのような現象を防止する方法があるのか、誰でも説明できますか?
prodモードまたはdevモードで実行していますか? –
実際、Devでは、シングルスレッドになってしまいます。 –
TomCatにデプロイするときにはPRODモードが強制されているはずなので、この動作はTomCatには存在しません。同じブラウザからリクエストされた場合のみ... – adis