2013-03-25 70 views
0

我正在做一些應該在60秒內完成的操作,但可能會有一些罕見的情況需要更長時間(但不會超過10分鐘)。它在應用程序引擎文檔中說,如果您捕獲了DeadlineExceededException,那麼在永久失敗之前,您只有不到一秒的時間才能完成操作。這是否足夠時間將任務添加到隊列和/或執行數據存儲寫入?我假設最安全的方式是在操作開始時添加異步/寫入數據存儲實體(異步)任務,並在操作完成時將其從隊列中刪除。後一種方法會用掉兩倍的api電話,但是值得嗎?DeadlineExceededException和DataStore /任務隊列操作

回答

2

我會建議使用隊列作爲所有操作的默認值,所以如果您發現死線超過錯誤,您將不必執行回退。與用戶無需等待操作完成的事實相比,它更整潔,更易於維護。爲了達到這個目的,你可以用ajax調用你的隊列並在後臺獲得結果,這樣用戶就不會等待操作完成。是值得的,因爲它可以「保證」你可能需要的時間窗口。

+0

我擔心的是持續輪詢服務器以檢查隊列是否完成。我正在做的是讓客戶端訪問服務器,它將首先檢查數據存儲以查看操作的緩存版本是否存在,如果存在則返回該操作。如果沒有,我會動態生成響應,將其緩存到數據存儲並返回。這些反應中的大多數可以在60秒內生成,但有些可能需要更長的時間。我希望我可以通過在必要時排隊響應來限制服務器輪詢的數量。什麼時候保證隊列?我多久進行一次民意調查? – cowmix 2013-03-26 21:01:40

1

在引發異常以準備自定義響應之後,運行時環境爲請求處理程序提供了更多時間(小於一秒)。所以將它添加到任務隊列中就足夠了。

1

如果您不希望客戶端繼續輪詢任務隊列結果,我建議您查看Channel API。它將使您能夠向客戶端實施推送通知。

在任務隊列的末尾,您只需向客戶端發送通知,讓他現在就可以處理任務。