2013-05-15 48 views
0

我們在我們的應用服務器的tomcat上運行。關閉輸出流後,servlet請求會發生什麼?

我們有一個生成PDF文件,並返回到瀏覽器的servlet。然後刪除臨時PDF文件。

問題是我們在刪除時遇到了一些時間上的困難。我們團隊中的某個人決定在刪除文件之前等待20秒,因此他們使用Thread.sleep(20000)。

有趣的是,他們關閉輸出流,等待20秒,然後再刪除文件和退出的doGet()。

我的問題是:由於輸出流的響應關閉時,它,是否有任何性能問題在20秒鐘等待立即返回給瀏覽器的等待過嗎?例如,它是否捆綁了一個網絡連接或一些這樣的?

+0

不是tomcat自動刪除臨時文件嗎?你有什麼時間困難?一旦pdf由servlet寫入並且流關閉,文件可以立即被刪除。 – Thihara

+5

爲什麼您需要首先將PDF存儲在磁盤文件系統中?爲什麼不直接寫入'response.getOutputStream()'而不是'FileOutputStream()'?請注意,如果文件保持打開狀態,則無法刪除該文件。在將PDF寫入磁盤之後,您可能忘記了'FileOutputStream#close()'。 – BalusC

+0

那麼,服務器上的一個工作線程就被佔用了20秒。 你可以使用螢火蟲尋找一個連接的網絡連接 – Ben

回答

0

哦,不,我已經把類似的東西在一個應用程序,它現在運行了相當一段時間,只輸出流是封閉的,所以你不能與用戶的當前請求了溝通,但由於使用doGet沒存在,所以servlet的對象不會被銷燬 ,直到線程超時結束。

可能沒有關於網絡帶寬的問題,因爲刪除和等待只發生在內存中,就像後臺任務一樣,影響網絡帶寬的唯一因素是發送響應所需的時間,因爲您快速反應,然後再完成你的工作,然後確定。

我會建議但使用destroy()方法,而不是刪除該文件。

0

我會建議使用File.createTempFile()來創建臨時文件(除非你已經嘗試這樣做是不可行的,你無論出於何種原因),並讓Java的決定時將其刪除。通過在你的servlet中使用Thread.sleep(),你實質上就是持有servlet實例。 ServletContainers爲隨後的請求創建一個servlet池,任何生活了20秒的servlet都會增加池大小,並且Servlet將不能用於下一個請求,因此容器除了爲後續請求創建新實例外沒有別的選擇。

可能沒有任何網絡或帶寬相關的問題。但是,按照您所描述的方式堅持一個Servlet是一種災難。