议程:我想异步获取http响应
,然后以同步方式使用它们。
我使用 Jersey
客户端和 jersey-rx-client-java8
。
这是我的代码:
ExecutorService executorService = Executors.newSingleThreadExecutor();
RxClient<RxCompletionStageInvoker> client = Rx.newClient(RxCompletionStageInvoker.class, executorService);
Stream<String> urls_stream = Stream.of("stackoverflow.com", "stackoverflow.com");
urls_stream.map(url -> {
return client
.target(url)
.request()
.rx()
.get()
.whenComplete((response, throwable) -> {
// this should be executed by 1 thread
out.println(response.readEntity(String.class));
if (null != throwable) throwable.printStackTrace();
})
.toCompletableFuture();
})
// Wait completion
.collect(Collectors.toList()).forEach(list -> {
CompletableFuture.allOf(list).join();
});
我有另一个代码,这个示例比第一个示例运行得更快。
String[] url_str = { ... };
Client client = ClientBuilder.newClient(config);
CountDownLatch cdl = new CountDownLatch(urls.length);
for (String url_str : urls) {
Future<Response> response = client.target(url_str).request().async().get(new InvocationCallback<Response>() {
@Override
public void completed(Response response) {
out.println(response.readEntity(String.class));
cdl.countDown();
}
@Override
public void failed(Throwable t) {
t.printStackTrace();
cdl.countDown();
}
});
}
cdl.await();
我想证明第一个示例运行得更快(但我不想增加池中的线程)。
最佳答案
据我了解,即使在异步模式下,Jersey 也为每个连接使用一个线程。只有一种可能的解决方案是增加池中的线程。
关于java - 以 rx 方式与 Jersey 客户端合作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469435/