Повестка дня: Я хочу получить http-отзывы asynchronously
, но затем работать с ними синхронно. Я использую Jersey
клиентов и jersey-rx-client-java8
. Это мой код:Работа с клиентом Джерси в стиле rx
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();
Я хочу архивировать, что первый пример работает быстрее (но я не хочу увеличивать потоки в пуле).
Непонятно, чего вы хотите достичь, пожалуйста, объясните больше, что вы ожидаете, и что заставляет вас поверить, что ваши запросы работают синхронно. –