2013-03-02 54 views
0

我的應用程序中有一個servlet過濾器,我需要從中調用一個Web服務,這需要一些時間來返回響應,然後將響應存儲在會話中稍後使用。我希望在這個時間過程發生的時候,我的過濾器應該繼續運行,並且應該繼續調用其他過濾器,以便不影響性能。在servlet過濾器產生的單獨線程中運行花費時間

所以這就是我在doFilter()裏面做的事情。爲此創建一個不同的線程。

log.debug("start filter"); 
CustomThread ct=new CustomThread(); 
ct.start(); //invoke web service in run() 
log.debug("continuing with filter"); 

考慮到1000個用戶將會碰到應用程序的事實,這種方法是否能夠正常工作。這種情況在某些情況下會失敗嗎? 請建議,如果我需要採取不同的路線。

回答

1

你應該使用某種Executor而不是自己擔心線程管理。 Executors class提供了創建執行程序實例的各種簡單方法。

2

主要問題是每次啓動一個新線程。這是非常耗時的,並且如果您有很多併發請求,它可能會使服務器癱瘓,因爲您對生成的線程數沒有任何限制。

我會使用ThreadPoolExecutor來代替,這將解決這兩個問題。

+0

是的,這正是我的問題所在。在這種情況下,線程數量將翻倍。我從未使用過ThreadPoolExecutor。所以我需要看看它。感謝您的建議:) – nevin 2013-03-02 18:03:02

+0

我也使用struts 2和spring security 3.現在我需要在用戶成功通過身份驗證後執行此任務。因此,一旦用戶成功通過身份驗證,我可以在安全配置中將defaultTargetUrl設置爲可執行此任務的某個操作。據我所知,struts將爲每個請求創建一個單獨的動作實例。這會解決我的目的嗎?我不想冒任何風險,因爲這很關鍵。因此,問。 – nevin 2013-03-03 14:43:59

相關問題