/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.http.client;

import java.io.Closeable;
import java.io.IOException;
import java.net.URI;

import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.Configurable;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.nio.client.HttpAsyncClient;
import org.apache.http.protocol.HttpContext;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.http.HttpMethod;
import org.springframework.util.Assert;

Asynchronous extension of the HttpComponentsClientHttpRequestFactory. Uses Apache HttpComponents HttpAsyncClient 4.0 to create requests.
Author:Arjen Poutsma, Stephane Nicoll
See Also:
  • HttpAsyncClient
Since:4.0
Deprecated:as of Spring 5.0, in favor of HttpComponentsClientHttpConnector
/** * Asynchronous extension of the {@link HttpComponentsClientHttpRequestFactory}. Uses * <a href="https://hc.apache.org/httpcomponents-asyncclient-dev/">Apache HttpComponents * HttpAsyncClient 4.0</a> to create requests. * * @author Arjen Poutsma * @author Stephane Nicoll * @since 4.0 * @see HttpAsyncClient * @deprecated as of Spring 5.0, in favor of * {@link org.springframework.http.client.reactive.HttpComponentsClientHttpConnector} */
@Deprecated public class HttpComponentsAsyncClientHttpRequestFactory extends HttpComponentsClientHttpRequestFactory implements AsyncClientHttpRequestFactory, InitializingBean { private HttpAsyncClient asyncClient;
Create a new instance of the HttpComponentsAsyncClientHttpRequestFactory with a default HttpAsyncClient and HttpClient.
/** * Create a new instance of the {@code HttpComponentsAsyncClientHttpRequestFactory} * with a default {@link HttpAsyncClient} and {@link HttpClient}. */
public HttpComponentsAsyncClientHttpRequestFactory() { super(); this.asyncClient = HttpAsyncClients.createSystem(); }
Create a new instance of the HttpComponentsAsyncClientHttpRequestFactory with the given HttpAsyncClient instance and a default HttpClient.
Params:
  • asyncClient – the HttpAsyncClient instance to use for this request factory
Since:4.3.10
/** * Create a new instance of the {@code HttpComponentsAsyncClientHttpRequestFactory} * with the given {@link HttpAsyncClient} instance and a default {@link HttpClient}. * @param asyncClient the HttpAsyncClient instance to use for this request factory * @since 4.3.10 */
public HttpComponentsAsyncClientHttpRequestFactory(HttpAsyncClient asyncClient) { super(); this.asyncClient = asyncClient; }
Create a new instance of the HttpComponentsAsyncClientHttpRequestFactory with the given CloseableHttpAsyncClient instance and a default HttpClient.
Params:
  • asyncClient – the CloseableHttpAsyncClient instance to use for this request factory
/** * Create a new instance of the {@code HttpComponentsAsyncClientHttpRequestFactory} * with the given {@link CloseableHttpAsyncClient} instance and a default {@link HttpClient}. * @param asyncClient the CloseableHttpAsyncClient instance to use for this request factory */
public HttpComponentsAsyncClientHttpRequestFactory(CloseableHttpAsyncClient asyncClient) { super(); this.asyncClient = asyncClient; }
Create a new instance of the HttpComponentsAsyncClientHttpRequestFactory with the given HttpClient and HttpAsyncClient instances.
Params:
  • httpClient – the HttpClient instance to use for this request factory
  • asyncClient – the HttpAsyncClient instance to use for this request factory
Since:4.3.10
/** * Create a new instance of the {@code HttpComponentsAsyncClientHttpRequestFactory} * with the given {@link HttpClient} and {@link HttpAsyncClient} instances. * @param httpClient the HttpClient instance to use for this request factory * @param asyncClient the HttpAsyncClient instance to use for this request factory * @since 4.3.10 */
public HttpComponentsAsyncClientHttpRequestFactory(HttpClient httpClient, HttpAsyncClient asyncClient) { super(httpClient); this.asyncClient = asyncClient; }
Create a new instance of the HttpComponentsAsyncClientHttpRequestFactory with the given CloseableHttpClient and CloseableHttpAsyncClient instances.
Params:
  • httpClient – the CloseableHttpClient instance to use for this request factory
  • asyncClient – the CloseableHttpAsyncClient instance to use for this request factory
/** * Create a new instance of the {@code HttpComponentsAsyncClientHttpRequestFactory} * with the given {@link CloseableHttpClient} and {@link CloseableHttpAsyncClient} instances. * @param httpClient the CloseableHttpClient instance to use for this request factory * @param asyncClient the CloseableHttpAsyncClient instance to use for this request factory */
public HttpComponentsAsyncClientHttpRequestFactory( CloseableHttpClient httpClient, CloseableHttpAsyncClient asyncClient) { super(httpClient); this.asyncClient = asyncClient; }
Set the HttpAsyncClient used for synchronous execution.
See Also:
  • setHttpClient(HttpClient)
Since:4.3.10
/** * Set the {@code HttpAsyncClient} used for * {@linkplain #createAsyncRequest(URI, HttpMethod) synchronous execution}. * @since 4.3.10 * @see #setHttpClient(HttpClient) */
public void setAsyncClient(HttpAsyncClient asyncClient) { Assert.notNull(asyncClient, "HttpAsyncClient must not be null"); this.asyncClient = asyncClient; }
Return the HttpAsyncClient used for synchronous execution.
See Also:
  • getHttpClient()
Since:4.3.10
/** * Return the {@code HttpAsyncClient} used for * {@linkplain #createAsyncRequest(URI, HttpMethod) synchronous execution}. * @since 4.3.10 * @see #getHttpClient() */
public HttpAsyncClient getAsyncClient() { return this.asyncClient; }
Set the CloseableHttpAsyncClient used for asynchronous execution.
Deprecated:as of 4.3.10, in favor of setAsyncClient(HttpAsyncClient)
/** * Set the {@code CloseableHttpAsyncClient} used for * {@linkplain #createAsyncRequest(URI, HttpMethod) asynchronous execution}. * @deprecated as of 4.3.10, in favor of {@link #setAsyncClient(HttpAsyncClient)} */
@Deprecated public void setHttpAsyncClient(CloseableHttpAsyncClient asyncClient) { this.asyncClient = asyncClient; }
Return the CloseableHttpAsyncClient used for asynchronous execution.
Deprecated:as of 4.3.10, in favor of getAsyncClient()
/** * Return the {@code CloseableHttpAsyncClient} used for * {@linkplain #createAsyncRequest(URI, HttpMethod) asynchronous execution}. * @deprecated as of 4.3.10, in favor of {@link #getAsyncClient()} */
@Deprecated public CloseableHttpAsyncClient getHttpAsyncClient() { Assert.state(this.asyncClient instanceof CloseableHttpAsyncClient, "No CloseableHttpAsyncClient - use getAsyncClient() instead"); return (CloseableHttpAsyncClient) this.asyncClient; } @Override public void afterPropertiesSet() { startAsyncClient(); } private HttpAsyncClient startAsyncClient() { HttpAsyncClient client = getAsyncClient(); if (client instanceof CloseableHttpAsyncClient) { @SuppressWarnings("resource") CloseableHttpAsyncClient closeableAsyncClient = (CloseableHttpAsyncClient) client; if (!closeableAsyncClient.isRunning()) { closeableAsyncClient.start(); } } return client; } @Override public AsyncClientHttpRequest createAsyncRequest(URI uri, HttpMethod httpMethod) throws IOException { HttpAsyncClient client = startAsyncClient(); HttpUriRequest httpRequest = createHttpUriRequest(httpMethod, uri); postProcessHttpRequest(httpRequest); HttpContext context = createHttpContext(httpMethod, uri); if (context == null) { context = HttpClientContext.create(); } // Request configuration not set in the context if (context.getAttribute(HttpClientContext.REQUEST_CONFIG) == null) { // Use request configuration given by the user, when available RequestConfig config = null; if (httpRequest instanceof Configurable) { config = ((Configurable) httpRequest).getConfig(); } if (config == null) { config = createRequestConfig(client); } if (config != null) { context.setAttribute(HttpClientContext.REQUEST_CONFIG, config); } } return new HttpComponentsAsyncClientHttpRequest(client, httpRequest, context); } @Override public void destroy() throws Exception { try { super.destroy(); } finally { HttpAsyncClient asyncClient = getAsyncClient(); if (asyncClient instanceof Closeable) { ((Closeable) asyncClient).close(); } } } }