2011-09-20 52 views
0

我是新來的澤西,jsp的和一般的Web應用程序開發,所以希望這不是一個愚蠢的問題。我有一個jsp,當用戶點擊一個按鈕時,它會啓動一個HTTP請求,大約需要5-10分鐘才能返回。一旦完成,他們會被重定向到另一個頁面。多線程一個jsp?

我想知道,是否有可能,甚至可取,我多線程應用程序,以便重處理將開始,但用戶被重定向到下一個.jsp馬上。如果多線程無法實現,那麼您會推薦另一種方法來處理Web應用程序中的繁重處理?

回答

3

一個JSP基本上是一個Servlet(它被翻譯成一個Java Servlet Class並編譯)。特別是你可以在一個servlet中啓動一個新的線程(因此在一個JSP中,通過scriptlet),但是由於多種原因,並不建議這麼做。

建議通過ajax進行異步HTTP調用,然後,一旦調用完成後立即向用戶顯示其他內容,並在回調返回時顯示結果。

1

您可以創建一個TimerTask(或Quartz Job)並將其設置爲立即執行並將用戶重定向到某個其他頁面,而不是等待JSP中的進程完成。讓那個Job把結果存儲在一個可以被另一個JSP訪問的中心位置(如果你想稍後拉取Job的結果,可能會通過ajax)。這樣做可以節省你手動管理線程的難度(這很容易出錯) ,你會得到異步功能,用戶不需要看5-10分鐘左右的空白瀏覽器屏幕。

0

這是可能的。

創建一個線程,將其引用存儲在任何地方(靜態地圖)並存儲其密鑰(在會話中,在JSP的答案的代碼中)。

以下調用可以檢索線程並檢查其狀態/結果。

不管怎樣,小心使用:

a)您將需要控制舊的結果將被刪除。瀏覽器有時會關閉,這是不可避免的,所以你需要一個看門狗清除顯然不再需要的數據。

b)用戶不習慣這種行爲。他們很可能會「回頭」並嘗試重新啓動線程,並且一次又一次地發生嚴重的風險。嘗試控制它(理想情況下,線程的id將鏈接到用戶,所以只要舊線程處於活動狀態,用戶將無法啓動另一個線程)。

2

而不是每次創建一個新的線程有一個工作線程持續輪詢共享隊列可能更有效率。例如,使用ArrayBlockingQueue,您的Web請求可以簡單地將對象添加到隊列並返回給用戶,並且您的工作線程(或重複計劃作業)可以處理重量級處理。

+0

這不會真正解決很多無反應的UI問題...... –

+0

它是所述問題的解決方案。用戶界面響應,立即通知用戶他們的請求已收到並排隊處理。 –