如何分组gwt-rpc调用?

时间:2008-10-25 18:12:58

标签: ajax gwt gwt-rpc dwr

使用DWR,可以将多个服务调用组合到一个HTTP请求中:
dwr batch feature

 此功能对于减少ajax应用程序的延迟非常有用。 有没有办法与GWT / GWT-RPC做类似的事情?
谢谢你的帮助

4 个答案:

答案 0 :(得分:8)

Google的Ray Ryan做了关于Best Practices For Architecting Your GWT App的演讲,在那里他谈到了使用命令模式。发送碰巧通过RPC的异步命令是您可能想要的。一旦发送命令而不是RPC,就可以很容易地批处理它们。

有关为您实现此模式的库,请参阅gwt-dispatch。我刚刚开始使用它,所以我不知道它是否自动批量处理,但是它都是带有许可许可证的开源软件,所以如果没有,你可以修复它。

答案 1 :(得分:1)

GWT不提供批量处理多个任意RPC的一步式解决方案。但是,请记住,GWT的自动序列化使得编写每个RPC方法的串行版本和批处理版本变得非常容易。例如,假设您已定义此RPC:

FooResponse callFoo(FooRequest request);

自己编写同一个RPC的“批处理”版本很容易:

ArrayList<FooResponse> batchCallFoo(ArrayList<FooRequest> requests) {
  ArrayList<FooResponse> responses = new ArrayList<FooResponse>();
  for (FooRequest request : requests) {
    responses.add(callFoo(request));
  }
}

答案 2 :(得分:1)

这是一个很好的问题,但我认为没有一个简单的解决方案。

我相信您必须创建一个单独的方法,将您的方法组合在一起,以类似于DWR的方式实现批处理。

即如果你有:

public int add(int x, int y);
public int sub(int i, int j);

您需要创建一种新方法来组合它们:

public Map<String, Integer> addAndSub(Map methodsAndArguments) {
    // Call add and sub methods with it's arguments
}

当然,您仍然需要在同一个回调方法中处理整个响应。

我意识到它可能不是最优雅的解决方案,但由于GWT RPC的工作方式,我认为这是最佳选择。使用GWT我认为你通常应该尝试编写你的方法,以便批处理甚至不是你需要考虑的问题。

答案 3 :(得分:1)

如果您的应用程序适合Comet(服务器端推送)域,您也可以使用GWTEventService

  

GWTEventService是一个基于事件的客户端 - 服务器通信框架。它使用GWT-RPC和Comet / server-push技术。客户端提供了一个高级API,可以将监听器注册到服务器,就像GUI组件一样。事件可以添加到服务器端的上下文/域中,并且客户端上的侦听器可以获知有关传入事件的信息。服务器端完全独立于客户端实现,并且具有高度可配置性。

因为此事件模型提供的优势之一是:

  

捆绑事件以减少服务器调用