2011-09-09 5 views
0

생성 시간이 200 초 이상인지를 감지하는 java의 필터가 있는데, 캐시 제어 헤더를 특정 시간으로 설정합니다.응답하는 방법 .setHeader가 작동합니까?

이것은 서버가 느려지는 것을 방지하기 위해 만들어졌으며 자동 부하 부하의 일종입니다.

어떤 기회는 응답 헤더의 일부를 쓰기 전에 몸을 쓸 때, 더 많은 메모리를 사용하여 containter serlvet함으로써, :

나는 그것에 대해 의심의 여지가?

resp.write()를 수행하는 동안 서블릿 컨테이너 (tomcat 또는 기타)가 데이터를 연결에 쓸 수 있습니까?

메모리 문제가 걱정됩니다. 응답이 끝날 때까지 버퍼를 사용하지 않고 모든 응답을 생성하기 위해 여분의 메모리를 사용하고 서블릿 컨테이너가 쓰기를 시작한다고 생각합니다.

+0

대부분의 Java 응용 프로그램 서버는 임계 값에 도달 할 때까지 출력을 버퍼링 한 다음 버퍼를 클라이언트로 플러시합니다. 모든 HTTP 헤더가 출력 될 때까지 HTTP 본문을 출력 할 수 없습니다. HTTP가 작동하는 방식입니다. –

+0

@paul : 임계 값에 도달하면 버퍼가 플러시되고 resp.setHeader()가 실행됩니다. 예외? – user2427

+0

또한 앱 서버에 따라 다릅니다. 필자의 경험은 WebSphere와 관련이 있으며, 해당 애플리케이션 서버는 접근 방식을 IllegalStateException을 던지는 것에서 경고를 로깅하는 것으로 바 꾸었습니다 (http://www-01.ibm.com/support/docview.wss?uid=swg1PQ97899). –

답변

0

이것은 응용 프로그램 컨테이너에 따라 다르며 절대적으로 100 % 메모리 사용에 큰 영향을 미치지 않습니다. 서면 응답의 버퍼 크기가 문제가되는 경우 Java는 아마도 당신을위한 플랫폼이 아닙니다.

위로 하드웨어가 플랫폼을 버립니다. 메모리 사용 관련 문제가있는 경우 잘못된 장소를 찾고있을 것입니다.

0

MISUNDERSTANDING : 나는 200 밀리를 기다리는 스레드가 있다고 생각하고, 아무렇지도 않게 넘어 갔을 때 헤더를 쓰고있다. 사례가 아닙니다 (응답 생성의 에 작성된 헤더). 이 경우 아래의 문제가 발생하지만, 내가 실제로 원하는 내용에 다시 답할 것입니다.


나는 서블릿에서 스레드 안전을 의미한다 "응답"을 믿지 않는다 - 내가 이해하고있는 경우 "200 기다려 당신은 (보조 스레드에서 응답 변수에 데이터를 작성하려고해서는 안 milliseconds "로직) 동안 요청 요청을 처리합니다.

필터가 "헤더"를 작성하기 전에 플러시되는 응답 부분에 대해 언급 된 문제 외에 데이터가 단순히 순서가 아니라 인식을 넘어 손실되거나 왜곡 될 수 있습니다.

그러나 필터에서 응답의 래퍼를 제공 할 수 있습니다. 래퍼 클래스를 threadsafe로 만들고 출력을 버퍼로 만듭니다. 다음 200 밀리 후 (동기화 된, 원자 방식으로) 응답 버퍼에 있는지 확인하고 그렇지 않은 경우 적절하게 플래그 플래그를 지정할 수 있습니다.

+0

은 다른 스레드에 없으며 요청을 감싸는 필터에 있습니다. – user2427

0

버퍼 크기를 으로 설정하지 않고이 "무한대"가 아니라 동적 프록시/호출 처리기 쌍을 응답 구현 주위의 래퍼로 만드는 것이 좋습니다.

http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

귀하의 필터가 호출 핸들러를 생성하고 실제 응답 구현 대신 체인의 다음 필터/서블릿에 전달하는 동적 프록시에 넣 참조하십시오.

체인에서 더 깊은 정보가 반환되면 필요한 경우 헤더를 생성하고 프록시에서 버퍼링 된 데이터를 가져와 헤더 뒤에 본문을 쓸 수 있습니다.

예, 메모리를 사용합니다.너무 많이 걱정할 것이라고 말할 수는 없습니다. 응용 프로그램에서 20MB "페이지"를 반환하는 경우 문제를 해결할 수 있습니다. (페이지 매김 등)

관련 문제