如何杀死尚未完成的GWT RPC

时间:2012-10-15 05:43:11

标签: gwt rpc gwt-rpc

我的代码用于向多个用户发送电子邮件。用户点击发送按钮,将调用rpc。现在,如果用户点击取消按钮。应该取消正在进行的rpc。 。有人可以帮忙吗?

我google了很多,他们介绍了Request Builder的概念。但我没有得到任何完美的想法。

3 个答案:

答案 0 :(得分:7)

让异步方法返回Request而不是void,以便您可以在其上调用cancel()

  

出于同样的原因,异步方法没有返回类型;他们通常会失效。如果您希望更多地控制待处理请求的状态,请返回Request。

- 来源:https://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideCreatingServices

仅供参考,您也可以使用RequestBuilder作为返回类型,然后您必须自己调用send()方法(在可能自定义请求之后,例如添加标题)以实际制作请求服务器。

当然,如果你需要告诉服务器中止处理,你将不得不再进行一次RPC调用。

答案 1 :(得分:1)

请求是异步的,因此客户端可以做任何想做的事情。 您需要做的就是添加一个标志以指示应该取消该请求,然后更改onSuccess方法以检查该标志,如果已设置则不执行任何操作。

每次提出请求时都应清除requestCancelled标记 - 否则在取消第一个请求后,您将无法再生成另一个请求...

e.g。

boolean requestCancelled = false;

void onSuccess(...)
{
    if (!requestCancelled) {
        // actual response handing code
    }
}

如果你真的想在服务器端取消请求,那就复杂得多了。您可以通过发送第二个请求来执行此操作 - 其中一个请求是取消请求。 为了使这项工作,“取消请求”必须在“电子邮件请求”可以读取的某个地方设置一个字段。 “电子邮件请求”需要检查是否已设置“取消字段”。

// server side Impl
void cancelRequest()
{
    // You need to implement this class and ensure it really is a singleton
    // and thread safe.
    RequestStatusSingleton.setCancelled(true);
}

void serverSideEmailFunc()
{
    while(modeEmailAddrs && ! RequestStatusSingleton.getCancelled()) {
        // get next address and send email
    }
}

显然这是一项很多工作。你考虑过了吗?

  1. GUI上没有取消按钮?
  2. 让服务器一次处理几个电子邮件(即客户端发送多个请求,直到服务器告诉客户端所有电子邮件都已完成)。

答案 2 :(得分:0)

我完全理解您的用户。没有人愿意等待15秒。

没有标准方法可以“终止”请求,因为无法知道服务器/数据存储区在实现它的位置。除非您处理可以放在可以回滚的单个事务中的进程,否则您将必须实现自己的逻辑。例如,如果您要求服务器保存实体,则必须告诉服务器再次保存此实体,但这次没有更改。

另外,再想想你的用例。为什么用户想杀死请求?可能他只是想去应用程序中的另一个地方。然后没有必要终止请求:当响应到达时,检查用户是否仍在耐心等待的同一个地方。如果没有,请不要执行onSuccess()。