2011-08-22 7 views
33

내 웹 응용 프로그램에는 20 초 이상 지속되는 요청이 있습니다. 그러나 어떤 상황에서는 코드가 무한 루프 또는 이와 유사한 서버로 연결될 수 있습니다.Tomcat 요청 시간 초과

서버 측에 60 초 동안 요청 시간 제한을 넣으려고합니다. 이것은 바람둥이에 구현됩니까?

는 Horatiu 감사

+0

당신이'Socket'와'ServerSocket'를 사용하고 있습니까를 사용할 수 있습니까? 만약 당신이 있다면, 당신은'SetSoTimeout' 메쏘드로 타임 아웃을 설정할 수 있기 때문입니다. –

+0

그냥 평범한 바람둥이 –

+0

@Eran, 그는 웹 응용 프로그램을 개발 중입니다. 그는 Tomcat에 의해 열린 서버 소켓을 액세스 할 수 없습니다. – AlexR

답변

37

Tomcat 7에서는 StuckThreadDetectionValve을 추가하여 "멈춤"된 스레드를 식별 할 수 있습니다.당신은 설정 수있는 응용 프로그램의 컨텍스트 요소에 밸브를 당신이 감지하고 싶은 곳 :

<Context ...> 
    ... 
    <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve" 
    threshold="60" /> 
    ... 
</Context> 

이는이 바람둥이로 항목 60 초보다 오래 걸립니다 어떤 스레드 것에 대한 기록 WARN 작성합니다 응용 프로그램을 식별하고 결함이 있기 때문에 응용 프로그램을 금지 할 수 있습니다.

source code을 기반으로 스레드를 멈추려는 밸브를 작성할 수는 있지만 스레드 풀에 영향을주는 노크가 있으며 해당 스레드의 협력없이 Java에서 스레드를 중지하는 no reliable way이 있습니다. 타임 아웃 당신이 원하는대로 초에 설정 (45)과 같이 스레드 ...

+1

런타임에 예외를 throw하는 것으로 충분하지 않은 스레드를 죽이는 대신에 –

9

당신이 다음에 시간 제한을 설정, 너무 오래 실행 요청을 방지하기 위해 시도하는 경우에 당신은 server.xml의

<Connector URIEncoding="UTF-8" 
    acceptCount="100" 
    connectionTimeout="20000" 
    disableUploadTimeout="true" 
    enableLookups="false" 
    maxHttpHeaderSize="8192" 
    maxSpareThreads="75" 
    maxThreads="150" 
    minSpareThreads="25" 
    port="7777" 
    redirectPort="8443"/> 
+0

내 애플리케이션에만 영향을 미치는 방법이 있습니까? –

+1

불행히도 AFAIK 내가 틀릴 수도 있습니다 서버에서 시간 초과 효과가 없습니다 – Chris

+6

connectionTimeout은 연결이 설정되면 Tomcat이 http 요청 행을 기다리는 시간입니다. 서버가 요청 처리를 기다리는 시간에 영향을주지 않습니다. – Dave

19

에 기본 시간을 설정할 수 있습니다 Tomcat이 도움이되지 않습니다. Chris가 말했듯이 Tomcat에 대한 전역 시간 초과 값을 설정할 수 있습니다. 그러나 The Apache Tomcat Connector - Generic HowTo Timeouts에서 응답 시간 제한 섹션을 참조하십시오.

JK도 요청 응답시 제한 시간을 사용할 수 있습니다. 이 제한 시간은 응답의 전체 처리 시간을 측정하지 않습니다 ( ). 대신, 그것은 연속적인 응답 패킷 사이의 시간이 허용되는 시간을 제어합니다 ( ).

대부분의 경우 실제로 이것이 원하는 것입니다. 예를 들어 장기 실행 다운로드를 고려해보십시오. 다운로드가 수 분 동안 지속될 수 있기 때문에 유효 전체 응답 시간 제한을 설정할 수 없습니다. 대부분의 응용 프로그램은 응답을 반환하기 위해 을 시작하기 전에 처리 시간이 제한되어 있습니다. 이러한 응용 프로그램의 경우 명시적인 응답 시간 만료를 설정할 수 있습니다. 응답 타임 아웃과 조화되지 않는 응용 프로그램은 처리 시간이 긴 것으로 예상되는 일괄 처리 응용 프로그램, 데이터웨어 하우스 및보고 응용 프로그램입니다.

JK가 응답 대기 시간을 중단하면 응답 시간 초과가 발생하여 백엔드에서 처리를 중지 할 수 없습니다. 웹 서버에서 처리 리소스를 해제해도 요청은 응답 시간이 초과되면 결과를 다시 보낼 방법이없이 백엔드에서 계속 실행됩니다.

그래서 Tomcat은 서블릿이 제한 시간 내에 응답하지 않은 사용자, 에 대한 응답을 다시 보내드립니다하지만를 실행하는 스레드를 멈추지 않을 것이라는 점을 감지합니다. 나는 네가하고 싶은 것을 성취 할 수 있다고 생각하지 않는다.

+0

아마도 jboss 에서요? Google 앱 엔진이 30 초 또는 그와 비슷한 작업을 수행했습니다. –

+3

링크가 오래되었습니다. – rouan

1

이 기사에서는 서버 수준에서 시간 제한을 설정하는 방법에 대해 설명합니다. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

무한 루프가되는 원인은 무엇입니까? 다른 리소스에 대한 연결을 여는 경우 이러한 연결에 제한 시간을 설정하고 시간 제한이 발생할 때 적절한 응답을 보내고 자 할 수 있습니다.

+0

왜이 사이트에 대한 자격이 주어 집니까? 대답은 거기에 게시 된 질문과 관련이 있습니다. – thcricketfan

+4

문서가 ** 세션 ** 타임 아웃에 관한 내용이기 때문에 투표가 끝났다고 생각합니다 –

-6

는 속성을 변경, 바람둥이 서버를 두 번 클릭 "로컬 호스트에서 톰캣 7.0 서버"로, 이클립스에서

이클립스

에서 바람둥이 추가

+2

서버 시작 타임 아웃을 요청 시간 초과 자체? –

+0

질문은 http 요청 시간 초과가 아니라 시작/중지 시간 제한에 대해 얘기하고 있습니다 –

-1

아무도 해결책을 좋아하지 않는 사람을 위해 나처럼 위에서 말하면, 직접 타이머를 구현하고 런타임 예외를 던져서 요청 실행을 멈출 수 있습니다. 뭔가 아래 같은 :

    try 
       { 
        timer.schedule(new TimerTask() { 
         @Override 
         public void run() { 
         timer.cancel(); 
         } 
        }, /* specify time of the requst */ 1000); 
       } 
       catch(Exception e) 
       { 
        throw new RuntimeException("the request is taking longer than usual"); 
       } 

바람직하게는 자바 구아바 timeLimiter here

+1

downvote가 무엇입니까? – george