2013-05-15 2 views
0

우리는 우리의 응용 프로그램 서버에 대해 tomcat에서 실행 중입니다.출력 스트림을 닫은 후 Servlet 요청은 어떻게됩니까?

우리는 PDF를 생성하고 브라우저로 리턴하는 서블릿을 가지고 있습니다. 그런 다음 임시 PDF 파일을 삭제합니다.

문제는 우리가 삭제에 약간의 타이밍 어려움을 겪고 있다는 것입니다. 우리 팀의 누군가는 파일을 삭제하기 전에 20 초를 기다려야하므로 Thread.sleep (20000)을 사용하기로 결정했습니다.

재미있는 점은 출력 스트림을 닫고 20 초 동안 기다린 다음 파일을 삭제하고 doGet()을 종료한다는 것입니다.

내 질문은 : 출력 스트림이 응답에서 닫히기 때문에 기다리기 전에 즉시 브라우저로 돌아오고 추가로 20 초 동안 성능 문제가 있습니까? 예를 들어, 네트워크 연결 또는 일부를 연결합니까?

+0

tomcat이 임시 파일을 자동으로 삭제하지 않습니까? 그리고 당신이 갖는 타이밍 어려움은 무엇입니까? pdf가 서블릿에 의해 작성되고 스트림이 닫히면 파일을 즉시 삭제할 수 있습니다. – Thihara

+5

왜 PDF 파일을 디스크 파일 시스템에 저장해야합니까? 왜 그냥'response.getOutputStream()'에 직접 쓰지 않고'new FileOutputStream()'을 쓰는 것이 좋을까요? 파일이 열려 있으면 파일을 삭제할 수 없습니다. 아마도 PDF를 디스크에 쓴 후'FileOutputStream # close()'를 잊어 버렸을 것입니다. – BalusC

+0

글쎄, 서버의 작업자 스레드가 20 초 동안 점유되었습니다. 방화벽 연결을 사용하여 연결된 네트워크 연결을 찾아 낼 수 있습니다. – Ben

답변

0

글쎄요, 저는 애플리케이션과 실행 중일 때 꽤 자주 실행됩니다. 출력 스트림 만 닫히기 때문에 사용자의 현재 요청과 더 이상 통신 할 수 없지만 doGet은 실행되지 않았습니다. 스레드 타임 아웃이 끝날 때까지 서블릿의 객체는 파괴되지 않습니다. .

삭제 및 대기는 백그라운드 작업과 같이 메모리에서만 발생하기 때문에 네트워크 대역폭과 관련하여 문제가 없을 것입니다. 네트워크의 대역폭에 영향을주는 것은 응답을 보내는 데 걸리는 시간과 빨리 반응하고 나중에 일을 끝내십시오.

그러나 파일을 삭제하는 대신 destroy() 메서드를 사용하는 것이 좋습니다.

0

임시 파일을 만들 때 File.createTempFile()을 사용하는 것이 좋습니다. (이미 시도한 것이 아니고 어떤 이유에서든 가능하지 않은 경우) Java에서 파일을 삭제할시기를 결정하게하십시오. 서블릿에서 Thread.sleep()을 사용하면 기본적으로 서블릿 인스턴스를 보유하게됩니다. ServletContainer는 후속 요청을위한 서블릿 풀을 생성하고 20 초 동안 생존하는 모든 서블릿은 풀 크기를 증가시킬 것이고 서블릿은 다음 요청에 사용할 수 없으므로 컨테이너는 후속 요청에 대한 새 인스턴스를 만드는 것 이외의 옵션을 갖지 않습니다 .

네트워크 또는 대역폭 관련 문제가 없을 수 있습니다. 그러나 설명하는 방식으로 서블릿을 붙잡는 것은 재앙을위한 처방입니다.

관련 문제