2012-12-05 198 views
1

我一直在做一些關於取消ajax請求的研究,並且我在這裏閱讀了關於這個主題的幾個主題。我發現這個非常翔實的話題:在服務器端停止ajax請求

Abort Ajax requests using jQuery

根據它,當你使用abort()方法,該請求被取消在客戶端上,但不一定是在服務器端。事情是我的請求需要一些沉重的計算,我希望能夠停止在客戶端和服務器端,如果它開始花費太長時間。 有什麼辦法可以做到嗎?

ps:超時請求不會幫我在這裏。我使用JSF調用一個調用優化算法的bean,如果可能,我想按需停止算法。

+2

您使用哪種服務器端技術? –

+0

我正在使用Glassfish。我也忘了提及我也在使用JSF。 – Tinadm

回答

0

爲了使這種情況可靠地發生,您需要讓繁重計算的代碼像在後臺處理的長時間運行的任務一樣行事。然後,您的請求會發出任務,並與該用戶的會話綁定。要取消執行,則需要不同的請求。這可以通過客戶端的定時器在發起請求返回之後完成,如果它在設定的時間段之後發生,或者它可以由用戶用按鈕或其他方式啓動。

另一種選擇是讓任務本身跟蹤其時間,並在一段時間後自行放棄它。您可以將所需的時間作爲參數或任何最適合的方式傳遞,並在超過更長時間時拋出異常。然後,您的服務器端代碼將嘗試/捕獲例程並相應地響應每個場景。

+0

這是個好主意。我會嘗試創建第一個請求,創建一個新線程並開始計算。正如你所說的,第二個請求可以通過按鈕或其他方式觸發,設置一個標誌來停止線程。一旦我完成,我在這裏張貼結果。 – Tinadm

+0

似乎創建了另一個任務來運行計算,正如我在之前的評論中所說的那樣。但是我遇到了另一個問題:如果用戶沒有取消任務並且它正常結束,我怎麼能通知我的應用程序它已經結束,因爲我的FacesContext實例不再有效?我的意思是,如何按照您的建議將我的任務與用戶會話綁定? – Tinadm

+0

這完全是一個完全不同的項目......我們是一個.net商店,但我們使用[Quartz](http://quartz-scheduler.org/)的C#端口以編程方式安排長時間運行的任務和存儲過程適當時在數據庫中的信息。您最終會得到三個端點:一個用於啓動該任務,另一個用於監視所述任務的進度,另一個用於可選地取消該任務。 這不是一個「簡單」的解決方案,但是我發現在幾乎所有我已經開始的Web應用程序項目中,啓動長時間運行的後臺任務的能力具有深遠的好處。 –