2011-11-29 260 views
3

我們有一個REST服務調用可能需要2分鐘以上處理的系統進程。由於在客戶端上,我不想等待服務器回覆30秒到2分鐘的響應,我是否可以將202返回給客戶端,以通知它正在處理中,但不一定需要等待進程完?爲REST服務異步返回http狀態碼202?

有沒有一種安全的方法來處理這個問題? (我確信這裏存在線程安全問題,特別是如果該服務可能會同時觸發大量請求,那麼創建大量線程可能不是解決方案。)

我們正在探索的是使用批處理每5分鐘檢查一次,以檢查數據庫是否需要生成報告(這是系統過程的用途),但我對這種可能性感到好奇。

在此先感謝

編輯 最終產品實際上是被生成的,然後通過電子郵件發送給用戶的PDF報告。我主要試圖避免等待服務響應返回消費客戶的〜2分鐘。

+0

所以你真正要問的是,REST服務是否可以返回202 *然後繼續處理*? –

+0

正確的,正如http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html狀態代碼202.我只是試圖解決等待部分沒有數據庫變化atm。批處理是我們尚未實現的未來任務,但如果這種方式是可能的,我們很好奇。 – DavidAndroidDev

+0

@JimMischel所以,是的,你是對的。但是,我認爲直到服務完成執行它的方法之前,纔會對客戶端進行響應。我很好奇,如果我們可以在方法執行期間返回狀態碼。因此問題的異步性。 – DavidAndroidDev

回答

1

我認爲從服務立即返回202是好的,因爲它承認成功收到創建pdf的請求。

您計劃在數據庫中記錄未決請求並分批處理它們對我來說是有意義的。如果每次發送PDF文件都沒有錯誤(比如消息隊列/工作者角色系統),每個pdf文件都被勾選爲「完成」,我認爲它可以正常工作。

如果你不想去分貝路線服務端點可以產卵另一異步工作,然後返回一個202這樣的PDF作業立即啓動客戶得到即時響應 - 但這看起來似乎有點凌亂國際海事組織。

編輯:重新讀你的問題 - 我不認爲你可以返回202,並繼續在相同的功能處理。一旦你回來了,就是這樣了(除非你產生了另一個異步作業,如上)。

1

只要你使用一些排隊機制,你應該沒問題。數據庫的工作原理或者您可以使用更爲奇特的解決方案,例如全面排隊系統。我會返回202與Location頭指向某種狀態頁面,最終包含您的處理結果的鏈接。

+0

那麼,最終產品(這是一個PDF報告)實際上是通過電子郵件發送給用戶的。用戶確實不需要從服務中檢查報告是否準備好。我會將其添加爲編輯。 – DavidAndroidDev

相關問題