如何对 gwt-rpc 调用进行分组?

Posted

技术标签:

【中文标题】如何对 gwt-rpc 调用进行分组?【英文标题】:How to group gwt-rpc calls? 【发布时间】:2008-10-25 18:12:58 【问题描述】:

使用 DWR 可以将多个服务调用组合成一个 HTTP 请求:dwr batch feature 此功能对于减少 ajax 应用程序的延迟非常有用。 有没有办法用 GWT / GWT-RPC 做类似的事情? 感谢您的帮助

【问题讨论】:

【参考方案1】:

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

请参阅gwt-dispatch 了解为您实现此模式的库。我刚开始用,不知道是不是自动批处理,不过都是开源的,有许可证,没有的话可以修。

【讨论】:

【参考方案2】:

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));
  

【讨论】:

您的解决方案不起作用,因为 GWT 中的 RPC 是异步的;他们在通话后立即返回; AsyncCallback 处理程序负责处理该值。 除非他的 batchCallFoo 是服务器端实现,在这种情况下,它会工作,但作为客户端调用,他的批处理实现没有做任何事情 - 它重复调用 callFoo,这是“批量”调用的对立面。【参考方案3】:

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

我相信您必须创建一个单独的方法,将您的方法组合在一起,以类似于 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,我认为您通常应该尝试编写您的方法,这样批处理甚至不会成为您需要考虑的问题。

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

以上是关于如何对 gwt-rpc 调用进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GWT-RPC 以外的方式访问 GWT servlet?

如何减少 responseJSON 中的样板,就像我使用 URLRequestConvertible 对相关的 Web 调用进行分组一样

如何集成 GWT-RPC、Android 和 GAE?

在 Perl 中使用 Getopt 时如何对参数进行分组?

如何在c#中对所有日志进行分组

如何使用 HttpClient 发送 GWT-RPC 请求?