2012-01-05 92 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