2011-06-14 31 views
6

我正在JSF 2.0中開發一個應用程序,我想要一個多行文本框,它顯示正在從文件實時讀取(逐行)輸出數據。通過多線程AJAX實時交換數據

因此,我們的目標是讓一個頁面上有一個按鈕,觸發後端開始從文件中讀取數據,然後在文本框中讀取結果時顯示結果。


我曾想過通過以下方式這樣做:

擁有當地頁跟蹤哪些行已檢索/到目前爲止,在文本框中顯示。

定期地,本地頁面將使用AJAX輪詢後端並請求任何已讀取的新數據(告訴它到目前爲止該頁面有哪些行,並且從那時起只檢索新行)。

這將持續到整個文件被完全檢索。


問題是,從文件中讀取的bean方法正在運行一個while循環,它會阻塞。因此,要從它正在寫入的數據結構中讀取數據,將需要使用其他線程,更正嗎?我聽說在Web應用程序中產生新的線程是一個潛在的危險舉措,應該使用線程池等。

任何人都可以對此有所瞭解嗎?


更新:我嘗試了幾個不同的東西,沒有運氣。但我確實設法通過產生一個單獨的Thread來運行我的阻塞循環,而主線程可以在處理AJAX請求時使用它來讀取它。有沒有一個好的庫可以用來做類似的事情,這仍然給JSF一些生命週期控制這個Thread

+0

您是否針對具有EJB支持的Java EE 5或6容器? – BalusC 2011-06-17 20:26:02

+0

我在沒有EJB支持的Tomcat服務器上部署這個...我希望我可以訪問@Asynchronous註釋,但是我沒有 – idolize 2011-06-17 21:48:31

回答

1

您是否考慮過實現Future接口(包含在Java5 + Concurrency API中)?基本上,當你讀入文件時,你可以將它拆分爲幾個部分,並簡單地創建一個新的Future對象(對於每個部分)。然後,一旦計算完成,就可以讓對象返回。

通過這種方式,您可以避免在循環操作時必須訪問該結構,並且還可以將操作拆分爲更小的計算,從而減少發生鎖定的時間量(總鎖定時間可能會更長,但您的響應速度會更快到其他地區)。如果你保持你的Future對象被創建的順序,那麼你不需要追蹤第#行。請注意,調用Future.get()會阻塞,直到對象處於「就緒」狀態。

其餘的你的方法是類似的 - 使Ajax調用從FIFO隊列中獲取所有'ready'未來對象的內容。

我想我明白你想要完成什麼..也許多一些信息會有所幫助。