2013-06-05 4 views
0

Tomcat을 사용하고 있습니다. ServletResponse.flushBuffer에 대한 설명서는 다음과 같이 말합니다. "버퍼의 내용을 클라이언트에 강제로 기록합니다.이 메서드를 호출하면 응답이 자동으로 커밋되어 상태 코드와 헤더가 기록됩니다." 하지만이 문제를 해결할 수 없습니다. 클라이언트가 응답을 성공적으로 수신 할 때까지이 함수에서 내 doPost 메서드를 차단하겠습니까? 연결 시간이 좋지 않은 경우 ServletResponse.flushBuffer 스레드를 고정시킬 수 있습니까? 또는 전달이 비동기 적으로 수행됩니까?ServletResponse.flushBuffer - 응답이 배달 될 때까지 차단합니까?

제 목표는 내 고객이 응답을 보는 데 걸리는 시간을 측정하는 것입니다. flushBuffer에 대한 호출 직전과 직후에 시간을 측정하고 싶지만이 시간에 클라이언트 소켓에 메시지를 전달하는 모든 프로세스가 포함되어 있는지 확실하지 않습니다. 클라이언트가 성공적으로 응답을받을 때까지

감사합니다, & rzej

답변

1

내 서블릿이 기능을 차단됩니다?

No. 현재 스레드은 전체 응답이 소켓 송신 버퍼에 쓰여질 때까지 차단됩니다.

연결 시간이 좋지 않은 경우 ServletResponse.flushBuffer가 서블릿을 정지시킬 수 있습니까?

아니요, 현재 스레드 만입니다.

전달이 비동기 적으로 수행됩니까?

예. 그렇지만 응답은 먼저 버퍼링해야합니다 (위 참조). 피어가 읽지 않았기 때문에 버퍼가 채워지거나 데이터가 전달되지 않고 ACK 되었다면 충분한 공간이 생길 때까지 쓰기 쓰레드가 차단됩니다.

+0

나는 그것이 내 질문에 정확하지 않다고 본다. 내'doPost'/doGet 메소드가 추가 스레드를 시작하지 않는다는 가정에 덧붙여서'doPost' /'doGet' 메소드의 실행 만 차단하는 것을 차단했습니다. 나의 궁극적 인 목표는'doPost' /'doGet'에서 응답의 배달 시간을 측정하는 것입니다. – Andrzej

+0

TCP 버퍼링으로 인해 할 수 없습니다. 측정 할 수있는 것은 TCP 송신 버퍼에 응답을 얻는 데 걸리는 시간입니다. 청크 분할 또는 스트리밍 전송 모드를 사용하지 않는 경우에도 Servlet 컨테이너의 내부 버퍼 (아마도 ByteArrayOutputStream)에 쓸 시간입니다. 귀하의 설명은 아무 것도 추가하지 않습니다. 동기화를하지 않는 한 어떤 블록이 현재 쓰레드이고, 서블릿이나 그 메소드는 차단되지 않습니다. – EJP

관련 문제