使用DWR,可以将多个服务调用组合到一个HTTP请求中:
dwr batch feature
此功能对于减少ajax应用程序的延迟非常有用。
有没有办法与GWT / GWT-RPC做类似的事情?
谢谢你的帮助
答案 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组件一样。事件可以添加到服务器端的上下文/域中,并且客户端上的侦听器可以获知有关传入事件的信息。服务器端完全独立于客户端实现,并且具有高度可配置性。
因为此事件模型提供的优势之一是:
捆绑事件以减少服务器调用