2012-06-19 55 views
5

在Play中執行某種進度指示器的最佳方式是什麼?Play框架中的進度指示器

我有一個簡單的導入頁面,用戶可以上傳一個csv文件。服務器然後進行一些長處理,直到導入完成。我想在上傳後將用戶重定向到一個單獨的頁面,並在此頁面上給他一些持續的反饋,即「導入了856個數據集中的150個」。

上傳操作會觸發一個控制器方法,該方法可以在自己的線程中啓動耗時的任務,但是如何從另一個頁面獲得ajax調用的作業狀態(因爲播放沒有任何類型的請求之間的狀態)?

回答

3

你可能要做的是從你的控制器創建一個作業。事實上,如果您閱讀了Play文檔,則明確建議您在作業中執行長時間運行的處理,以免它們佔用HTTP請求線程。

因此,您的工作正在運行,通過處理您的CSV文件。下一步是記錄每個數據集的處理時間。所以,假設你通過你的工作一個參考,像一個用戶名或一些獨特的號碼,你傳回給你的客戶。然後你只需要記錄(可能在數據庫中,如果你想順從無狀態和輕鬆擴展),你的唯一ID處理的數據集的數量就會增加。

例如

@Entity 
public class DatasetProgress extends Model { 

    public Long uid; 
    public Long datasetsDone; 
    public Long datasetsTotal; 

} 

然後,您可以創建一個返回根據你的uid,你可以用它來顯示一個進度條的DatasetProgress對象的控制器操作。

1

你可以做的一件事是有一些集中通知的事情。你可以給導入一些唯一的標識符,並寫入用這個ID鍵入的更新消息。然後要檢索狀態,只需使用該鍵即可。

另一個選擇是使用網絡套接字,並基本上推送通知回到客戶端(雖然他們還沒有廣泛支持)。

+1

我會同時使用John和@Codemwnci的答案來完成這項任務,特別是如果您確定您將使用支持WebSocket或至少Comet的瀏覽器。在這種情況下,你可以構建真正的實時進度條。 – biesior