2012-01-05 80 views
1

this示例中有一個關於如何使用Timer#schedule來制定超時邏輯的相當詳細的描述。但那裏有一個陷阱。我們有2個RPC請求:首先在服務器上進行大量計算(或者可能從數據庫中檢索大量數據),然後是一個很小的請求,立即返回結果。如果我們提出第一個請求,我們不會立即收到結果,而是會有一個超時,超時後我們發出第二個微小請求,然後abortFlag來自示例,所以我們可以檢索第二個請求的結果,而且我們可以檢索先前超時的第一個請求的結果(因爲第一個調用的AsyncCallback對象沒有被銷燬)。取消gwt rpc調用

所以我們需要在超時發生後取消第一次rpc呼叫。我怎樣才能做到這一點?

回答

7

讓我給你一個比喻。

你,老闆,打電話給供應商,得到一些產品信息。供應商說他們需要給你回電,因爲這些信息需要一些時間才能收集。所以,你給他們與你的工頭聯繫。

您的領班等待電話。然後你告訴你的領班如果需要30分鐘以上的時間取消信息請求。

你的領班認爲你是瘋子,因爲他無法取消請求,因爲他沒有一個帳戶,使他有權訪問供應商的訂購系統。

因此,您的工頭在30分鐘後根本無視供應商的任何響應。你的巧妙工頭在他的電話裏設置了一個計時器,在30分鐘後忽略了供應商的電話。即使你殺了你的工頭,切斷了所有的通訊鏈接,供應商仍然會忙着處理你的請求。

GWT客戶端沒有任何東西可以取消。回調只是一個等待被調用的javascript對象。

要取消呼叫,您需要告訴服務器端停止浪費cpu資源(如果這是您的擔憂)。您的服務器端必須編程爲提供一個服務API,該API在被調用時將取消該作業並立即返回以觸發您的GWT回調。

您可以刷新頁面,並放棄頁面請求並關閉套接字,但服務器端仍然會運行。並且,當服務器端完成其任務並嘗試執行http響應時,它將失敗,並在服務器日誌中稱其丟失了客戶端套接字。

這是一個非常直接的推理。

因此,它落入您的servlet /服務的設計中,以前的請求如何被後續請求識別。

級聯回調

如果請求2是依賴於要求1的狀態,你應該進行級聯的回調。如果請求2將在成功運行,那麼您應該將請求2放入回調的onFailure塊中。而不是一個接一個地提交這兩個請求。

否則,定時器應觸發請求2,和請求2將有兩個職責:

  • 告訴服務器取消先前請求
  • 得到小塊信息的
+7

有實際上是可以在客戶端取消的東西 - http請求本身。如果服務器以某種方式卡住(下一次調用無法取消先前的情況),則連接可能保持打開狀態,並且根據瀏覽器的不同,可能會導致連接失敗。或者正在下載圖像,因此無法創建第二個RPC請求。事實證明,可以殺死http連接,但是這不會告訴服務器停止,只是釋放傳輸。爲此,從異步接口方法而不是void返回com.google.gwt.http.client.Request',並調用cancel。 – 2012-01-06 04:52:54