2012-02-17 3 views
3

나는 최근에 몇몇 코드를 테스트 중이었고 컨트롤러 액션/메소드 당 한 번에 하나의 스레드 만 활성화되었다는 사실에 놀랐다. 예를 들어, 컨트롤러에 대해 다음 두 작업을 고려하십시오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

찌르기 모드 또는 dev 모드로 실행 중이십니까? –

+0

실제로 Dev에서는 단일 스레드를 제공합니다. –

+0

Tomcat에서 배포 할 때 PROD 모드가 있어야합니다. 따라서 Tomcat에서는 동일한 브라우저에서 요청할 때만이 동작이 존재하지 않습니다. – adis

답변

5

테스트를 더 수행 한 후에는 동일한 브라우저 또는 다른 브라우저 인 경우 차이가 발생합니다 (아마도 재생 세션에 따라 다름).

예를 들어, 동일한 컨트롤러에 동시에 액세스하는 2 개의 Chrome 탭은 순차적입니다.

그러나 Chrome에서 1 개와 Safari에서 1 개가 예상대로 멀티 스레드됩니다.

+0

와우, 재미있는 catch ... prod 모드에서 실행하면 동일한 컨트롤러로 요청을 직렬화합니다. 동일한 브라우저 .... 그냥 프로덕션 모드에서 직접 시도했다. –

+0

스크래치, 내 대답을 참조하십시오 ... 그것은 playframework 아니었지만 브라우저가 두 번째 요청을 보내지 않습니다 (나는 무슨 일이 있었는지보고 wireshark 사용). –

+0

나는 왜 내가 똑같은 행동을하고 있는지 이해하지 못했다. 이 설명은 그것을 못 박았습니다. 자세한 내용은 @ user1212274 및 Dean Hiller에게 감사드립니다. –

2

재생 작업은 정적이지 동기 적이 지 않습니다.

그러나 동기식이란 재생 처리기 스레드입니다. Dev 모드에서는 기본적으로 단일 스레드로 설정되어 있으므로 사용자가보고있는 것일 수 있습니다.

0

나는 재시험을했고, 이것이 브라우저 기능 (플레이 프레임 제작 모드에있을 때)이라고 밝혀졌습니다. wireshark로 스니핑을했고 브라우저는 첫 번째 요청이 완료 될 때까지 두 번째 요청을 보내지 않았습니다. 이것은 플레이 프레임 워크와 관련이 없었지만, 재미있었습니다.

playframework가 프로덕션 모드에있을 때 동일한 클라이언트 일지라도 클라이언트는 자체 동작을 수행하고 두 번째 요청을 보내기 전에 동기화를 수행 할 수 있습니다.

관련 문제