2012-02-17 6 views
3

私は最近いくつかのコードをテストしていましたが、コントローラーのアクション/メソッドごとに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として実行しているときにも存在します。

なぜこのようなことが起こっているのか、またこのような現象を防止する方法があるのか​​、誰でも説明できますか?

+1

prodモードまたはdevモードで実行していますか? –

+0

実際、Devでは、シングルスレッドになってしまいます。 –

+0

TomCatにデプロイするときにはPRODモードが強制されているはずなので、この動作はTomCatには存在しません。同じブラウザからリクエストされた場合のみ... – adis

答えて

5

さらにテストを行った後は、同じブラウザまたは別のブラウザの場合は違いがあります(おそらく、プレイセッションによって異なる)。

たとえば、同じコントローラーに同時にアクセスするChromeタブは2つあります。

ただし、Chromeから1件、Safariから1件が期待どおりにマルチスレッド化されます。

+0

prodモードで実行すると、同じブラウザです....私は生産モードで自分自身を試してみました。 –

+0

スクラッチは、私の答えを参照してください...それはplayframeworkではなかったが、ブラウザは2番目のリクエストを送信しません(私は何が起こっていたかを見るためにwiresharkを使用しました)。 –

+0

なぜ私は同じ動作を見ていたのか分かりませんでした。この説明はそれを釘付けにした。詳細は@ user1212274とDean Hillerに感謝します! –

2

再生アクションは同期的ではなく静的です。

ただし同期とは、再生ハンドラスレッドです。 Devモードでは、デフォルトでは1つのスレッドになっているので、これはあなたが見ている可能性が高いです。

0

私は再テストしました。これはブラウザの機能です(プレイモードの場合)。私はwiresharkで盗聴し、ブラウザは最初のリクエストが完了するまで2番目のリクエストを送信しませんでした。これは、それが判明したプレイフレームワークとは関係ありませんでしたが、興味深い発見です。

sooooo、playframeworkがプロダクションモードのとき、同じクライアントでもクライアントは自分の振る舞いを持ち、2番目のリクエストを送信する前に同期を行うことができます。

関連する問題