2012-02-17 51 views
3

我最近正在测试一些代码,并且当我注意到每个控制器动作/方法一次只有一个线程处于活动状态时有点惊讶。例如,考虑以下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在任何给定的时间被执行。第二个请求等到第一个完成。但是,从一个浏览器调用testThread()并从另一个浏览器调用testThread2()会产生预期结果。只是为了澄清,默认线程(play.pool)的数量增加了,当在Tomcat中作为WAR运行时,这种行为也存在。

任何人都可以解释为什么会发生这种情况,是否有办法防止这种行为?

+1

您是在prod模式还是dev模式下运行? – 2012-02-17 19:48:48

+0

事实上,在Dev中,它将服务于单线程。 – 2012-02-18 17:16:36

+0

当在TomCat中进行部署时,它应该强制执行PROD模式,因此只有在从同一浏览器请求时,TomCat中才会存在此行为... – adis 2012-02-18 17:46:56

回答

5

做了更多的测试之后,如果它是相同的浏览器或不同的浏览器(可能取决于播放会话),它会有所不同。

例如,2个Chrome标签在同一时间访问同一个控制器将是顺序的。

但是,Chrome浏览器中的1个和Safari中的1个按预期会是多线程的。

+0

哇,有趣的catch ...在prod模式下运行将请求序列化到同一控制器相同的浏览器....只是在生产模式下自己尝试。 – 2012-10-28 16:54:12

+0

从头开始,看到我的答案...它不是playframework,但浏览器不发送第二个请求(我用wireshark来查看发生了什么)。 – 2012-10-28 17:00:16

+0

我不明白为什么我看到相同的行为;这个解释钉了它。感谢@ user1212274和Dean Hiller的细节! – 2014-07-28 22:49:52

2

播放动作是静态的,不是同步的。

但是同步的是Play Handler线程。在开发模式下,它默认为单个线程,因此,这可能是你所看到的。

0

我重新测试,结果证明这是一个浏览器功能(当处于playframework生产模式时)。我用wireshark嗅探,浏览器直到第一个请求完成时才发送第二个请求。这与其结果不一样,但有趣的发现。

sooooo,当playframework处于生产模式时,即使它是同一客户端,它也没有进行任何同步,但是客户端有自己的行为并且可能在发送第二个请求之前进行同步。