Вся идея выполнения асинхронного запроса заключается в том, что либо вы не хотите ждать запуска/завершения задачи 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
, позволяющая выполнять задачи асинхронно. Разумеется, как это естественно с этими пулами потоков, фактическое время начала задачи неопределенно и зависит от большого количества факторов, таких как загрузка, доступный центральный процессор и т. Д., И на него не следует полагаться.
Это отправьте запрос в первую строку. (Если быть точным: он просто планирует запрос. Скорее всего, нет фактического http-трафика после этой строки кода.) – zapl
Привет, я сделал некоторое тестирование сегодня, подтвердил, что AsyncRestTemplate отправляет запрос get() или addCallback() , а не при вызове метода getForEntity() или exchange(). –