在这个例子中,有一个很好的描述如何使用a创建超时逻辑Timer#schedule.但那里有一个陷阱.我们有2个rpc请求:首先在服务器上进行大量计算(或者可能从数据库中检索大量数据),然后是一个立即返回结果的微小请求.如果我们提出第一个请求,我们将不会立即收到结果,而是我们将超时并且在超时后我们发出第二个微小的请求然后abortFlag从示例中为真,所以我们可以检索第二个请求的结果,但我们也可以检索之前超时的第一个请求的结果(因为AsyncCallback第一个调用的对象没有被销毁).
所以我们需要在超时发生后取消某个rpc调用.我怎样才能做到这一点?
让我给你一个类比.
你,老板,打电话给供应商,获取一些产品信息.供应商表示他们需要给您回电,因为信息需要一些时间才能收集.所以,你给了他们工头的联系方式.
你的领班等待电话.然后,如果需要超过30分钟,您告诉您的工头取消信息请求.
你的工头认为你是疯子,因为他无法取消这个请求,因为他没有一个帐户可以让他有权访问供应商的订购系统.
因此,您的工头在30分钟后会忽略供应商的任何回复.你聪明的工头在他的手机中设置了一个计时器,在30分钟后忽略了供应商的电话.即使你杀了你的领班,切断了所有的通信链接,供应商仍然忙着为你的请求提供服务.
GWT客户端没有任何内容可以取消.回调只是一个等待调用的javascript对象.
要取消呼叫,您需要告诉服务器端停止浪费cpu资源(如果您担心这一点).您的服务器端必须编程为提供服务API,在调用时它将取消作业并立即返回以触发您的GWT回调.
您可以刷新页面,这将丢弃页面请求并关闭套接字,但服务器端仍将运行.当服务器端完成其任务并尝试执行http响应时,它将失败,在服务器日志中说它已丢失客户端套接字.
这是一个非常直接的推理.
因此,它属于servlet/service的设计,后续请求如何识别先前的请求.
级联回调
如果请求2取决于请求1的状态,则应执行级联回调.如果要成功运行请求2,则应将请求2放入回调的onFailure块中.而不是一个接一个地提交这两个请求.
否则,您的计时器应该触发请求2,而请求2将有两个职责: