2009-10-24 59 views
0

我需要編寫一個servlet,它將向用戶返回一個包含某些統計信息的csv。 我知道如何只返回文件,但我怎樣才能做到這一點,同時顯示文件創建過程的進度條?Java EE servlet創建文件並在創建文件時顯示進度

我無法理解如何在顯示創建文件的同時創建文件的過程中執行某些操作 - 如果創建一個將返回完成百分比的servlet,它如何保持創建相同的文件,同時每隔x秒向瀏覽器返回響應以顯示進度。

回答

2

有兩種根本不同的方法。一種是使用Comet等方法的真正的異步交付。您可以在文章中看到一些說明,例如this.我會使用這種方法,您提供的數據自然是增量式的 - 例如來自儀器的實時測量值。一些Java應用程序服務器在其JMS消息系統和彗星到瀏覽器之間具有良好的集成。

另一種方法是你有一個輪詢機制。瀏覽器中的JavaScript會定期調用服務器以獲取狀態(也可能是下一個數據塊)。這種方法的優點是你正在使用一個非常標準的編程模型,而不需要學習新東西。對於很多情況,例如「我正在處理堆棧溢出問題有新的答案嗎?」這已經足夠了。

您的挑戰可能是確定任何有用的進度信息。您如何知道您通過生成CSV文件有多遠?

如果你正在從一個servlet發起一個長時間運行的請求,很可能你會有效地分離一個工作線程來完成這項工作。 (也許使用JMS,也許使用異步工作者),並立即返回一個響應給瀏覽器,說「理解,我在想」。這可以確保您不易受Http響應超時的影響。那麼問題是如何確定當前的進展。除非做這項工作的「工人」有某種方式來表達其部分進展,否則你沒有任何用處。這種東西往往是特定於應用程序的。有些任務非常自然地有進展點(考慮印刷我們知道要做多少頁和打印多少)其他人不要(考慮確定一個數是否爲素數 - 是或否,也許沒有有用的中間階段)