2009-08-14 57 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