2009-08-14 75 views
2

我使用RequestBuilder超時這要花很長時間GWT請求:取消服務器端GWT通話

RequestBuilder requestBuilder = _service.getStatistics(callback); 
requestBuilder.setTimeoutMillis(5000); 
try { 
    requestBuilder.send(); 
} catch (RequestException e) { 
    GWT.getUncaughtExceptionHandler().onUncaughtException(e); 
} 

是否有通知呼叫已對超時了調用遠程服務的方式客戶端,它應該被取消?

+0

是你的'_service'異步接口的方法嗎?如果是,那麼您如何爲請求生成器指定方法和url? – maks 2012-01-06 09:17:36

回答

5

除非您再打電話告訴遠程服務,否則以前的呼叫被取消!

+0

感謝您的回答。我仍然希望另一種解決方案:-) – 2009-08-14 12:24:06

+0

你可以嘗試看看這個http://stackoverflow.com/questions/585599/whats-causing-my-java-net-socketexception-connection-reset,看看是否有什麼可以在服務器端使用 - 例如,如果你發現某種連接重置異常。這將是非常hacky,我wouldnt重新這樣的事情。 如果您確實需要告訴服務器prev呼叫超時,那麼再打一次電話就太糟糕了 - 只要它快速且快速。 – Chii 2009-08-14 12:28:38

+0

在服務器端,初始請求進來時將髒標誌設置爲false。向處理請求的服務器端類添加定時器。如果定時器在提供請求之前耗盡,則將髒標誌設置爲true,並返回該信息,或者從服務器端類中的定時器發出單獨的http請求。 – 2010-03-04 21:01:33

1

這實際上取決於。如果服務器正在做很多工作(並且您不在Google App Engine上),則可以保留請求並調用request.cancel()。這將結束瀏覽器的請求,但服務器將繼續工作。

根據您要返回的數據的格式,您可以讓服務器定期在客戶調用過程中向客戶端清空一些空數據。如果客戶端取消了請求並終止了HTTP連接,這將導致flush引發IOException。然後您可以捕獲該請求並停止在服務器端處理請求。

+0

感謝您的回答,它很有用。如果我沒有弄錯,這就是所謂的長輪詢模式。我仍然希望更簡單一些。 – 2009-08-20 19:53:19

+0

這與長時間輪詢事件是類似的想法,但該模式也適用於結束長時間的流程。還有其他的事情你不能輕易停止 - 一個緩慢的數據庫過程的調用不會終止,除非你實際關閉了一個連接,而不是僅僅把它返回到一個池。 我曾經使用過的一個技巧:如果在服務調用中需要大量東西來完成,請調出一個線程池執行程序,並創建每個第N個Runnable(其中N是線程池的大小)給客戶。這會讓你,給予或承擔,確保你不會執行超過2N-1個額外的任務。 – kebernet 2009-08-20 21:06:56