2016-09-13 4 views
0

Повестка дня: Я хочу получить 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(); 

Я хочу архивировать, что первый пример работает быстрее (но я не хочу увеличивать потоки в пуле).

+1

Непонятно, чего вы хотите достичь, пожалуйста, объясните больше, что вы ожидаете, и что заставляет вас поверить, что ваши запросы работают синхронно. –

ответ

0

Как я понял, Джерси использует один поток за соединение даже в асинхронном режиме. Единственное возможное решение - увеличение потоков в пуле.

Смежные вопросы