2010-10-15 49 views
4

一個簡單而理論的問題,答案可能是一個,但我想聽取一些意見和建議。我需要實現一個Web服務(Java),這將啓動一個耗時的過程,它將解析一些輸入文件並完成dome db人員。如何構建一個耗時的web服務

什麼是最好的方法讓用戶知道整個過程不僅開始,而且結束,解析,更新db ...?因爲我無法掛起用戶等待整個過程完成。

注意:用戶在啓動過程之前已通過身份驗證。

編輯:不僅通過網絡瀏覽器訪問網絡服務,但客戶端可以使用任何客戶端與他們想要的語言構建訪問它,只要他們引用wsdl。

感謝

+1

當它完成時發送給他們一封電子郵件 – Thilo 2010-10-15 07:27:00

+0

你提到你不能掛用戶等待,所以我們可以假設你正在使用單獨的線程進行解析,數據庫的東西等?當前Web服務正處於設計階段的時候 – 2010-10-15 07:27:03

+0

。沒有編寫代碼。所以任何建議都是值得歡迎的。我不想要的是讓用戶等待瀏覽器窗口打開,直到Web服務完成。 – Leonardo 2010-10-15 07:30:06

回答

6

對於您的場景,您應該實現異步Web服務。使用異步Web服務,您有兩種選擇。

  1. (有人已經提到),你可以做服務的輪詢,看看這個過程完成
  2. 您可以要求服務器回調

第一種方法是易於實施和它可以與許多WS庫一起工作。但是,這帶來了服務器不得不浪費帶寬來滿足客戶端輪詢請求的缺點。畢竟,這是投票。和大多數時候,投票是一個壞主意。

後者不會像前者那麼直接實施。而且我不知道每個JAX-WS庫是否都支持它。爲了支持你,我做了一個快速的谷歌搜索,並找到了這個鏈接。

http://www.developer.com/java/web/article.php/3863416/Using-Axis2-and-Java-for-Asynchronous-Web-Service-Invocation-on-the-Client-Side.htm

這可能會幫助你一點。

+0

+1提醒回撥。我肯定會推薦一個回調設計,而不是輪詢。當客戶端有能力收聽回調時,這當然是有效的,例如,如果客戶端是一個Web應用程序。如果您正在實現回調,則客戶端應該包含回調詳細信息,例如URL。 – Qwerky 2010-10-15 08:32:30

4

當他們提交的數據,讓他們調查(異步)與他們的令牌另一種方法我想給用戶一個令牌。

然後,在第一種方法中,我將數據添加到隊列中,並讓服務器上運行的另一個進程檢查該隊列並執行處理。然後更新數據庫中的令牌以通知用戶其作業已完成。

我之前就已經研究過類似的問題,並發現在基於HTTP/Web的系統上發起長時間運行的進程是一個糟糕的主意,因爲底層系統經常會超時調用長期運行的web服務。

+0

+1;你爲什麼談到「誘惑」?這種方法的黑暗面是什麼? – chiccodoro 2010-10-15 07:30:44

+0

@chiccodoro人物形象,但你是對的。這是我做到這一點的唯一方法! – 2010-10-15 07:47:59

+0

上個月我一直在做這件事。 +1 – 2010-10-15 08:14:34