【问题标题】:Cancel gwt rpc call取消 gwt rpc 调用
【发布时间】:2012-01-06 12:01:57
【问题描述】:

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

所以我们需要在超时发生后取消第一个 rpc 调用。我该怎么做?

【问题讨论】:

    标签: gwt gwt-rpc


    【解决方案1】:

    让我给你打个比方。

    您,老板,打电话给供应商,以获取一些产品信息。供应商说他们需要给您回电,因为收集信息需要一些时间。所以,你给了他们你的领班的联系方式。

    您的工头正在等待电话。然后你告诉工头如果超过 30 分钟就取消信息请求。

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

    因此,您的工头在 30 分钟后会忽略供应商的任何回复。您巧妙的工头在他的手机中设置了一个计时器,在 30 分钟后忽略来自供应商的电话。即使你杀了你的工头,切断了所有的通信链接,供应商仍然会忙于满足你的要求。

    在 GWT 客户端上没有什么可以取消的。回调只是一个等待被调用的 javascript 对象。

    要取消调用,您需要告诉服务器端停止浪费 cpu 资源(如果您担心的话)。您的服务器端必须进行编程以提供一个服务 API,该 API 在调用时会取消作业并立即返回以触发您的 GWT 回调。

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

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

    因此,它属于您的 servlet/服务的设计,如何通过后续请求识别先前的请求。

    级联回调

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

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

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

    【讨论】:

    • 实际上有一些东西可以在客户端取消——http请求本身。如果服务器以某种方式被卡住(下一个调用无法取消上一个调用),则连接可能会保持打开状态,并且根据浏览器的不同,您可能会用完连接。或者正在下载图像,因此无法发出第二个 RPC 请求。事实证明,可以终止 http 连接,但这不会告诉服务器停止,只是释放传输。为此,请从您的异步接口方法中返回 com.google.gwt.http.client.Request 而不是 void,然后调用 cancel。
    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多