我有一个Play 2.1 Java Web服务,它调用另一个Web服务。 我的服务通过转换其他Web服务的XML响应来提供JSON。
最初,我使用Jersey-Client lib来调用我的第二个服务。 由于这是一个阻塞调用,我修改了设置以允许并行500个线程。 我用它做了很好的结果,我做了一个加特里拉测试并且速度非常快(在远程服务器上处理10 000个请求需要32秒)。
然后我决定只使用异步调用来优化I / O. 现在我使用play.libs.WS客户端而不是使用默认线程池参数的jersey阻塞客户端。 我使用promises来获得我的结果,但我的其余代码与以前完全相同。
奇怪的是,我的加特林测试(只是一个发送一些http GET请求的循环)的性能下降了,速度慢了10倍......
我试图增加“默认调度程序”的线程数,但并不是更好。
可能是因为单个线程在WS调用之后处理XML和Json转换吗?
该应用程序的结构如下:
//controller :
Promise<Response> = myService.remoteEntities();
return async(promise.map(new Function<Response, Result>() {
public Result apply(Response response) {
List<Entity> entities = // ... XPATH and DOM parsing
return ok(jsonp(callback, toJson(entities)));
}
});
myService.remoteEntities定义如下:
public Promise<List<Entity>> myServiceMethod {
return WS.url(url.toString())
}
注意:myService是一个弹簧服务单例,我的路由/控制器使用带有'@'表示法的spring 我把它放在一个单独的类中,以便能够使用模拟进行测试
谢谢, 卢瓦克
注意:我最初在此处发布了我的问题:https://groups.google.com/forum/?fromgroups=#!topic/play-framework/SDpPA6UPyFQ