2010-03-04 96 views
4

我偶爾在我的Wicket應用程序中有一些長時間運行的AJAX請求。當發生這種情況時,應用程序基本上不可用,因爲隨後的AJAX請求排隊等待在當前請求之後同步處理。我希望請求在一段時間後終止,而不管響應是否已經返回(我有一個用戶要求,如果發生這種情況,我們應該向用戶提供錯誤消息並繼續)。這帶來兩個問題:長時間運行Wicket Ajax請求

  1. 有沒有什麼辦法可以指定一個 超時這是特定於AJAX 或全部AJAX請求(S)?
  2. 如果不是,有什麼辦法殺死當前的請求?

我已經通過檢票ajax.js文件看,我沒有看到任何一個請求超時的任何提及。

我甚至這麼遠,請嘗試重新加載客戶端上的一些超時後的頁面了,但不幸的是,服務器仍忙於處理原始AJAX請求,並不會返回,直到AJAX請求是否已處理完畢。

謝謝!

回答

3

我認爲它不會幫助你讓客戶「取消」請求。 (不過這可能是工作。)

的一點是,該服務器是忙於處理是不再需要的請求。如果你想暫停這樣的操作,你必須在服務器端實現超時。如果操作時間過長,則服務器將中止它並返回一些錯誤值作爲Ajax請求的結果。

關於你的排隊問題:你可能會考慮使用異步請求,儘管是同步請求。這意味着客戶端首先發送啓動長時間運行進程的請求。此請求立即返回。然後,客戶端定期輪詢服務器並詢問過程是否完成。那些輪詢請求也立即返回,表示該進程仍在運行,或者它已經完成了某個結果。

+0

感謝沃爾夫岡。我應該提到我們正在爲我們認爲可能會長時間運行的調用(報告,大型數據集等)異步地處理模型,但是我們正試圖解決這個問題,偶爾出乎意料的請求需要很長時間才能發現不可預知的原因。有時候,這是由於數據庫問題(重新編制索引,糟糕的查詢設計等)造成的,有時這是由於第三方服務請求花費的時間比預期長。理想情況下,我們會將所有這些調用異步封裝,但在軟件生命週期的這一點上,這是不可行的。感謝您的輸入。 – 2010-03-08 14:20:45

2

失敗溶液:一個給定的setTimeout後我殺死活性傳輸和重新啓動所述信道,它處理在客戶端側的一切。我通過將每個綁定到一個ID來避免請求衝突,並根據每次發出請求時以及每次請求完成時增加的全局引用來檢查它。

function longRunningCallCheck(refId) { 
    // make sure the reference id matches the global id. 
    // this indicates that we are still processing the 
    // long running ajax call. 
    if(refId == id){ 
     // perform client processing here 

     // kill all active transport layers 
     var t = Wicket.Ajax.transports; 
     for (var i = 0; i < t.length; ++i) { 
      if (t[i].readyState != 0) { 
       t[i].onreadystatechange = Wicket.emptyFunction; 
       t[i].abort(); 
      } 
     } 

     // process the default channel 
     Wicket.channelManager.done('0|s'); 
    } 
} 

不幸的是,這仍然使PageMap被阻塞,任何後續調用都會等待請求在服務器端完成。

我在這一點的解決方案是替代地提供用戶選項使用BookmarkablePageLink註銷(其實例化新的頁面,因此不具有對頁映射爭用)。絕對不是最佳的。

任何更好的解決方案都是值得歡迎的,但這是我能想到的最好的解決方案。

+0

+1用於識別併發布失敗的嘗試。如果沒有其他更多的知識。 – Matt 2010-03-09 17:49:28

+0

不知道它的幫助(我目前正在使用ajax + wicket):Wicket.Throttler(true)可以幫助暫停(參見wicket extension的wicket-autocomplete.js),然後你可以試試你的運氣再次使用AjaxLazyLoadPanel :-)作爲後臺任務(或參見wicketstuff的進度條) – Karussell 2010-09-09 13:17:49