取消gwt rpc通话

时间:2012-01-05 22:20:54

标签: gwt gwt-rpc

this示例中,有一个很好的描述如何使用Timer#schedule制作超时逻辑。但那里有一个陷阱。我们有2个rpc请求:首先在服务器上进行大量计算(或者可能从数据库中检索大量数据),然后是一个立即返回结果的微小请求。如果我们提出第一个请求,我们将不会立即收到结果,而是我们将超时,超时后我们发出第二个微小请求,然后示例中的abortFlag为真,因此我们可以检索第二个请求的结果,但我们也可以检索之前超时的第一个请求的结果(因为第一次调用的AsyncCallback对象没有被销毁)。

因此我们需要在超时发生后取消某个rpc调用。我怎么能这样做?

1 个答案:

答案 0 :(得分:7)

让我给你一个类比。

您,老板,打电话给供应商,获取一些产品信息。供应商表示他们需要给您回电,因为信息需要一些时间才能收集。所以,你给了他们你工头的联系。

你的领班等待电话。然后你告诉你的工头取消信息请求,如果超过30分钟。

你的工头认为你是疯子,因为他无法取消这个请求,因为他没有一个帐户可以让他有权访问供应商的订购系统。

因此,您的工头会在30分钟后忽略供应商的任何回复。你聪明的工头在他的手机中设置了一个计时器,在30分钟后忽略了供应商的电话。即使您杀死了您的领班,切断了所有通信链接,供应商仍然会忙于处理您的请求。

GWT客户端没有任何内容可以取消。回调只是一个等待调用的javascript对象。

要取消呼叫,您需要告诉服务器端停止浪费cpu资源(如果您担心这一点)。您的服务器端必须编程为提供服务API,在调用时它将取消作业并立即返回以触发您的GWT回调。

您可以刷新页面,这将丢弃页面请求并关闭套接字,但服务器端仍将运行。当服务器端完成其任务并尝试执行http响应时,它将失败,在服务器日志中说它丢失了客户端套接字。

这是一个非常直接的推理。

因此,它属于servlet / service的设计,后续请求如何识别先前的请求。

级联回调

如果请求2取决于请求1的状态,则应执行级联回调。如果要成功运行请求2,则应将请求2放入回调的onFailure块中。而不是一个接一个地提交这两个请求。

否则,您的计时器应该触发请求2,而请求2将有两个职责:

  • 告诉服务器取消之前的请求
  • 获取一小段信息