Play框架控制器操作是否同步?

时间:2012-02-17 16:10:58

标签: playframework

我最近测试了一些代码,当我发现每个控制器操作/方法一次只有一个活动线程时,我有点意外。例如,请考虑控制器的以下2个操作:

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运行时也存在这种行为。

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

3 个答案:

答案 0 :(得分:5)

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

例如,同时访问同一个控制器的2个Chrome标签将是连续的。

但是,Chrome中的1个和Safari中的1个将按预期进行多线程处理。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我重新测试了,结果证明这是一个浏览器功能(在playframework生产模式下)。我用wireshark嗅了嗅,浏览器没有发送第二个请求,直到第一个请求完成。这与它结果的游戏框架无关,但有趣的发现。

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