2012-09-12 86 views
2

我剛開始使用Wicket(並且真的不太熟悉很多Web開發)並且對於下載鏈接有疑問。我有一個Web應用程序,它只是允許用戶上傳特定文件,處理文件中的一些信息,並提供不同格式的處理信息的下載。然而,這實際上應該是我正在編寫的一些軟件的精簡版本,所以我真的不想做太多的處理。我想知道是否有辦法設置下載鏈接的超時時間,這樣如果用戶點擊鏈接並且處理時間超過20秒,它將簡單地退出處理並向它們發送錯誤代替。謝謝!在Wicket中設置下載鏈接超時?

回答

4

我與哈維同意,處理(和處理可能終止)應該用線程來完成。

但是,特別是如果它只需要幾秒鐘,不僅僅是等待打開的連接,而是定期檢查線程是否完成。

我會做這樣的事情:

  1. 啓動線程做實際工作
  2. 顯示Panel,說:「處理您的下載」或類似的東西。
  3. 將一個AbstractAjaxTimerBehavior附加到面板上,並持續時間爲10秒左右。
  4. 在計時器行爲的onTimer方法,檢查狀態的處理:
    • 如果它仍然在工作,什麼也不做。
    • 如果由於花費時間太長而取消,請向用戶顯示一條消息,例如「已取消」。通過更換面板或將警告標籤設置爲可見。
    • 如果完成,請顯示一條消息,如「您的下載開始」並開始下載。見this document如何做一個Ajax響應,並在同一時間啓動下載
+0

很好的答案。不知道該wiki頁面。謝謝 ;) –

2

爲了能夠取消處理,如果它需要超過給定的時間量,那麼在單獨的線程中執行它是適當的。這個問題在以下問題中得到解決:How to timeout a thread

現在對於Wicket部分:如果我明白你想要達到什麼目的,你可以例如推出自己的Link來執行處理,並在結果未響應的情況下作出響應。如果處理過程花費太多時間,您可以簡單地拋出一個錯誤(記住有一個FeedbackPanel,以便它可以顯示)。

爲了提高效率,可以在LoadableDetachableModel中執行處理或生成要下載的文件。詳情請參見這個問題:How to use Wicket's DownloadLink with a file generated on the fly?

例如:

IModel<File> processedFileModel = new LoadableDetachableModel<File>(){ 
    protected File load(){ 
     // Implement processing in a separate thread. 
     // If it times out it could return null, for instance 
    } 

} 

Link<File> downloadLink = new Link<File>("yourID", processedFileModel) { 
     @Override 
     public void onClick() { 
      File processedFile = getModelObject(); 
      if (file != null) { 
       IResourceStream rs = new FileResourceStream(file); 
       getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(rs)); 
      } else { 
       error("Processing took too long"); 
      } 
     } 
    }; 
+0

這仍然會阻止連接(從而保持連接在服務器上!),而等待處理做。 –

+0

使用'AjaxFallbackLink'會使事物與JS啓用異步,不是嗎?當然,Ajax響應無法傳回文件,因此ajax響應必須添加另一個鏈接或類似內容。 –

+0

Ajax鏈接在Wicket中排隊,所以它們仍然一個接一個地工作。在瀏覽器中,它們當然是異步的,但我的觀點是,連接將在您的服務器上打開,並且佔用它的資源。對於低容量服務來說不是問題,但要記住。 –