1.線程問題
數據導出時,由於調用了存儲過程,所以在後臺處理很多的東西,如果這時再次開啓另外一個任務,會造成服務器卡死的現象。所以爲了避免出現這種情況,使用了線程來調用存儲過程以及對數據的導出。
大概思路是:使用將map<String, Thread>放入到servletContext中,將線程放入到map中,在界面獲取這個map中的內容。如果map爲null,那麼說明當前服務器中沒有線程
在運行,說明此時服務器空閒。可以開啓新的任務。在線程開啓後,將線程對象放入map中,此時就可以實時掌握線程的運行情況。當線程運行完成後,在finally塊中需要將map
置空,保證下一次使用前map爲null。
2.界面刷新
在線程運行的過程中,界面需要進行刷新操作,來保證線程運行完成以後界面中任務的顯示狀態和內容會改變。此時,需要計時器函數的幫忙。
大概思路:界面使用了jQuery技術,使用applicationScope.XXX(attribute的內容)['key'] 可以獲取到servletContext中的內容。在$(function(){...});中定義每次刷新都會執行的
內容,就是計時器。 當獲取的內容不爲空時,有線程在運行,time = window.setInterval(fresh, 5000); 定義每個5S刷新一次,當內容爲null時,使用window.clearInterval(time)
關閉計時器,界面顯示完成後的最終效果。
3.額外需要注意
(1) 界面JS對時間的處理,需要判斷月份是否小於10來確定是否要給月份前邊加0.
(2) IO流讀取文件路徑:this.getSesion().getServletContext().getRealPath("/") + "/WEB-INF/...";
(3) 當寫入完成後需要進行flush()保證正常寫入,最後要關掉IO流。