2011-09-09 22 views
0

我在java中有一個過濾器,用於檢測生成時間是否超過200,然後將緩存控制標頭設置爲特定時間。如何response.setHeader的作品?

這是由以避免服務器變慢,排序的自動平衡其負載。

我有一個關於它的疑問:

,通過任何機會,在的serlvet containter使用更多的內存,當它寫一些響應頭的前寫的身體嗎?

能servlet容器(Tomcat或其他)的數據寫入連接,而我做的resp.write()?

我關心內存問題。我認爲它可能會使用額外的內存來生成所有的響應,沒有緩衝區,直到響應完成,然後servlet容器開始寫入。

+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

誤區一:我想有一個線程在等待200毫秒時間,然後寫頭時notbing發生過。不是這種情況(標題寫在結尾)。在這種情況下,下面的問題將成立,但我會再次嘗試回答你真正想要的。


我不相信「迴應」在Servlet中,就是要線程安全的 - 你不應該試圖將數據寫入到一個補充線程響應變量(如果我理解「等200毫秒「邏輯),而主要請求處理程序線程正在爲請求提供服務。

除了在過濾器寫入其「標題」之前有部分響應被刷新的問題之外,數據可能會簡單地被丟失或亂碼超出識別範圍(而不僅僅是失序)。

但是,你可以讓你的過濾器提供響應的包裝。使包裝類線程安全,並使其緩衝輸出。 然後,你可以在200毫秒後檢查(以同步的原子方式),以查看響應緩衝區中是否有任何內容,如果沒有則標記標題。

+0

不在另一個線程中,位於包裝請求的過濾器中。 – user2427

0

與其將緩衝區大小配置爲希望爲「無窮大」,您最好創建一個動態代理/調用處理程序對作爲響應實現的包裝。

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

你的過濾器創建調用處理程序,並把它的動態代理,你在地方的實際響應執行進入後續的過濾器/ servlet的鏈條。

當鏈中較深的東西返回時,如果需要,可以生成頭,然後從代理中獲取緩衝數據,以便可以在頭後面寫入主體。

是的,它使用內存。不能說我會擔心太多。如果您的應用程序返回一個20 MB的「頁面」,您可能需要將其作爲一個問題自行解決。 (分頁等)