2015-10-13 3 views
2

Сегодня я провел несколько экспериментов на AsyncRestTemplate. Ниже приведен фрагмент образца кода:Когда запрос отправки AsyncRestTemplate отправляется?

ListenableFuture<ResponseEntity<MyObject[]>> result 
          = asyncRestTemplate.getForEntity(uri, MyObject[]); 
List<MyObject> objects = Arrays.asList(result.get().getBody()); 

К моему удивлению, запрос не был отправлен Ури в первой строке (т.е. после вызова getForEntity), но после того, как послал result.get() называется.

Разве это не синхронный способ делать вещи?

+0

Это отправьте запрос в первую строку. (Если быть точным: он просто планирует запрос. Скорее всего, нет фактического http-трафика после этой строки кода.) – zapl

+1

Привет, я сделал некоторое тестирование сегодня, подтвердил, что AsyncRestTemplate отправляет запрос get() или addCallback() , а не при вызове метода getForEntity() или exchange(). –

ответ

0

Когда вы вызываете future.get(), вы по существу превращаете асинхронную операцию в синхронную, ожидая результата.

Не имеет значения, когда выполняется фактический запрос, важно то, что, поскольку он асинхронен, вам не нужно беспокоиться об этом, если только до тех пор, пока вам не понадобится результат.

Преимущество очевидно, когда вам нужно выполнить другую работу перед обработкой результата или когда вы не ожидаете результата вообще.

2

Вся идея выполнения асинхронного запроса заключается в том, что либо вы не хотите ждать запуска/завершения задачи async ИЛИ вы хотите, чтобы основной поток выполнял какую-либо другую задачу, прежде чем запрашивать результат из экземпляра Future. Внутри AsyncRestTemplate готовит AsyncRequest и вызывает метод executeAsync.

AsyncClientHttpRequest request = createAsyncRequest(url, method); 
      if (requestCallback != null) { 
       requestCallback.doWithRequest(request); 
      } 
      ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync(); 

Есть две реализаций - HttpComponentsAsyncClientHttpRequest (который использует высокую производительную асинхронную поддержку, оказываемую в Apache http component библиотеки) и SimpleBufferingAsyncClientHttpRequest (который использует средства, предоставляемые классы J2SE). В случае HttpComponentsAsyncClientHttpRequest, внутри он имеет нитевую фабрику (которая не управляется весной AFAIK), тогда как в SimpleBufferingAsyncClientHttpRequest существует резерв Spring AsyncListenableTaskExecutor. Все дело в том, что во всех случаях существует некоторая часть ExecutorService, позволяющая выполнять задачи асинхронно. Разумеется, как это естественно с этими пулами потоков, фактическое время начала задачи неопределенно и зависит от большого количества факторов, таких как загрузка, доступный центральный процессор и т. Д., И на него не следует полагаться.

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