取消服务器端GWT调用

取消服务器端GWT调用,gwt,gwt-rpc,Gwt,Gwt Rpc,我正在使用RequestBuilder超时耗时过长的GWT请求: RequestBuilder requestBuilder = _service.getStatistics(callback); requestBuilder.setTimeoutMillis(5000); try { requestBuilder.send(); } catch (RequestException e) { GWT.getUncaughtExceptionHandler().onUncaught

我正在使用
RequestBuilder
超时耗时过长的GWT请求:

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

有没有办法通知被调用的远程服务客户端上的呼叫已超时,应该取消该呼叫?

除非您再打一次电话告诉远程服务上一次呼叫已取消

这实际上要视情况而定。如果服务器正在做大量工作(而您不在Google App Engine上),您可以保留请求并调用Request.cancel()。这将结束浏览器的请求,但服务器将继续工作


根据返回数据的格式,您可以让服务器在处理调用时定期向客户端刷新一些空数据。如果客户端取消了请求并且HTTP连接终止,这将导致刷新引发IOException。然后,您可以捕获此请求并停止在服务器端处理该请求。

谢谢您的回答。我仍然希望有另一种解决方案:-)您可以尝试查看一下,看看是否可以在服务器端使用任何东西-例如,如果捕获某种连接重置异常。这将是相当骇客,我不会停止这种事情。如果你真的需要告诉服务器上一个调用超时了,那么再做一个调用也不会太糟糕——只要调用又快又快。在服务器端,当初始请求传入时,将dirty标志设置为false。向处理请求的服务器端类添加计时器。如果计时器在提供请求之前用完,则将dirty标志设置为true,并返回该信息,或者在服务器端类中从计时器发出单独的http请求。感谢您的回答,这非常有用。如果我没有弄错的话,这就是所谓的长轮询模式。我仍然希望有更简单的方法。这与长时间投票事件类似,但这种模式也适用于结束长时间的进程。还有一些事情你不能轻易停止——对慢速数据库过程的调用不会终止,除非你真的关闭了一个连接,而不仅仅是将它返回到一个池中。我以前使用过一个技巧:如果在一个服务调用中有很多事情要完成,那么启动一个线程池执行器,并使每N个线程池(其中N是线程池的大小)都可以运行,并向客户端刷新一点数据。这将让你,给予或接受,确保你不会执行超过2N-1个额外的任务。你的
\u服务
异步接口的方法是什么?如果是,那么如何为请求生成器指定方法和url?