使用 DWR 可以将多个服务调用组合成一个 HTTP 请求:
dwr 批处理功能
此功能对于减少 ajax 应用程序的延迟非常有用。有没有办法用 GWT / GWT-RPC 做类似的事情?
谢谢你的帮助
4 回答
Google 的 Ray Ryan 做了一个关于构建GWT 应用程序的最佳实践的演讲,他在演讲中谈到了使用命令模式。您可能想要发送碰巧通过 RPC 的异步命令。一旦您发送命令而不是 RPC,就很容易对它们进行批处理。
有关为您实现此模式的库,请参阅gwt-dispatch。我刚刚开始使用它,所以我不知道它是否会自动批处理,但它都是具有许可许可证的开源软件,因此如果没有,您可以修复它。
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));
}
}
这是一个很好的问题,但我认为没有一个简单的解决方案。
我相信您必须创建一个单独的方法,将您的方法组合在一起,以与 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,我认为您通常应该尝试编写您的方法,以便批处理甚至不会成为您需要考虑的问题。
如果您的应用程序适合 Comet 的域(服务器端推送),您也可以使用GWTEventService :
GWTEventService 是一个基于事件的客户端-服务器通信框架。它使用 GWT-RPC 和 Comet / server-push 技术。客户端提供了一个高级 API,可以将侦听器注册到服务器,就像注册一个 GUI 组件一样。事件可以添加到服务器端的上下文/域中,客户端的侦听器会收到有关传入事件的通知。服务器端完全独立于客户端实现并且是高度可配置的。
因为此事件模型提供的优势之一是:
捆绑事件以减少服务器调用