【发布时间】:2015-05-04 02:49:41
【问题描述】:
function1() 比 function2() 有什么好处(执行两个 GET 查询时的并行性很小)?在我看来,控制器线程在这两种情况下都是非阻塞的,但是在等待结果时必须阻塞其中一个后台线程。举个更好的例子,当我们查看 function3() 时,我们看到 databaseDao 线程被阻塞直到操作完成(使用内部 dao JPA)。
public static F.Promise<Result> function1() {
final F.Promise<WSResponse> twitterPromise = WS.url("http://www.twitter.com").get();
final F.Promise<WSResponse> typesafePromise = WS.url("http://www.typesafe.com").get();
return twitterPromise.flatMap((twitter) -> typesafePromise.map((typesafe) -> ok(twitter.getBody() + typesafe.getBody())));
}
public static F.Promise<Result> function2() {
F.Promise<String> promise = F.Promise.promise(() -> {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request1 = new HttpGet("http://www.twitter.com");
HttpGet request2 = new HttpGet("http://www.typesafe.com");
HttpResponse response = client.execute(request1);
HttpResponse response2 = client.execute(request2);
// result is not important
return response.toString() + response2.toString();
});
return promise.map(Results::ok);
}
public static F.Promise<Result> function3() {
F.Promise<String> promise = F.Promise.promise(() -> databaseDao.longRunningOperation());
return promise.map(Results::ok);
}
如果函数阻塞我们的后台线程池很快就会消失。那么非盈利性的游戏框架和承诺优于 Spring 框架和 tomcat?
编辑:
public static F.Promise<Result> function4() {
F.Promise<String> promise = F.Promise.promise(() -> {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request1 = new HttpGet("http://www.twitter.com");
HttpResponse response = client.execute(request1);
return response.toString();
});
F.Promise<String> promise2 = F.Promise.promise(() -> {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request2 = new HttpGet("http://www.typesafe.com");
HttpResponse response2 = client.execute(request2);
return response2.toString();
});
return promise.flatMap(p1 -> promise2.map(p2 -> ok(p1 + p2)));
}
上面的函数阻塞了两个线程,所以比function1还差?但是执行时间可以比较。比如promise1用5秒,promise2用4秒,结果会在5秒后出来?
【问题讨论】:
-
在你的第一个例子中,如果 twitter req.需要 5 秒和类型安全的请求。需要 4 秒,您将在 5 秒内得到结果。在第二个函数中需要 9 秒。另外我知道 JDBC 是阻塞的,所以不管你使用的是 Play、Spring 还是???,它都会在某个地方阻塞
标签: java playframework promise nonblocking