org.springframework.remoting.httpinvoker
Class HttpComponentsHttpInvokerRequestExecutor

java.lang.Object
  extended by org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor
      extended by org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor
All Implemented Interfaces:
Aware, BeanClassLoaderAware, HttpInvokerRequestExecutor

public class HttpComponentsHttpInvokerRequestExecutor
extends AbstractHttpInvokerRequestExecutor

HttpInvokerRequestExecutor implementation that uses Apache HttpComponents HttpClient to execute POST requests.

Allows to use a pre-configured org.apache.http.client.HttpClient instance, potentially with authentication, HTTP connection pooling, etc. Also designed for easy subclassing, providing specific template methods.

Since:
3.1
Author:
Juergen Hoeller
See Also:
SimpleHttpInvokerRequestExecutor

Field Summary
private static int DEFAULT_MAX_CONNECTIONS_PER_ROUTE
           
private static int DEFAULT_MAX_TOTAL_CONNECTIONS
           
private static int DEFAULT_READ_TIMEOUT_MILLISECONDS
           
private  HttpClient httpClient
           
 
Fields inherited from class org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor
CONTENT_TYPE_SERIALIZED_OBJECT, ENCODING_GZIP, HTTP_HEADER_ACCEPT_ENCODING, HTTP_HEADER_ACCEPT_LANGUAGE, HTTP_HEADER_CONTENT_ENCODING, HTTP_HEADER_CONTENT_LENGTH, HTTP_HEADER_CONTENT_TYPE, HTTP_METHOD_POST, logger
 
Constructor Summary
HttpComponentsHttpInvokerRequestExecutor()
          Create a new instance of the HttpComponentsHttpInvokerRequestExecutor with a default HttpClient that uses a default org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.
HttpComponentsHttpInvokerRequestExecutor(HttpClient httpClient)
          Create a new instance of the HttpComponentsClientHttpRequestFactory with the given HttpClient instance.
 
Method Summary
protected  HttpPost createHttpPost(HttpInvokerClientConfiguration config)
          Create a HttpPost for the given configuration.
protected  RemoteInvocationResult doExecuteRequest(HttpInvokerClientConfiguration config, java.io.ByteArrayOutputStream baos)
          Execute the given request through the HttpClient.
protected  HttpResponse executeHttpPost(HttpInvokerClientConfiguration config, HttpClient httpClient, HttpPost httpPost)
          Execute the given HttpPost instance.
 HttpClient getHttpClient()
          Return the HttpClient instance that this request executor uses.
protected  java.io.InputStream getResponseBody(HttpInvokerClientConfiguration config, HttpResponse httpResponse)
          Extract the response body from the given executed remote invocation request.
protected  boolean isGzipResponse(HttpResponse httpResponse)
          Determine whether the given response indicates a GZIP response.
 void setConnectTimeout(int timeout)
          Set the connection timeout for the underlying HttpClient.
 void setHttpClient(HttpClient httpClient)
          Set the HttpClient instance to use for this request executor.
 void setReadTimeout(int timeout)
          Set the socket read timeout for the underlying HttpClient.
protected  void setRequestBody(HttpInvokerClientConfiguration config, HttpPost httpPost, java.io.ByteArrayOutputStream baos)
          Set the given serialized remote invocation as request body.
protected  void validateResponse(HttpInvokerClientConfiguration config, HttpResponse response)
          Validate the given response as contained in the HttpPost object, throwing an exception if it does not correspond to a successful HTTP response.
 
Methods inherited from class org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor
createObjectInputStream, decorateInputStream, decorateOutputStream, doReadRemoteInvocationResult, doWriteRemoteInvocation, executeRequest, getBeanClassLoader, getByteArrayOutputStream, getContentType, isAcceptGzipEncoding, readRemoteInvocationResult, setAcceptGzipEncoding, setBeanClassLoader, setContentType, writeRemoteInvocation
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_MAX_TOTAL_CONNECTIONS

private static final int DEFAULT_MAX_TOTAL_CONNECTIONS
See Also:
Constant Field Values

DEFAULT_MAX_CONNECTIONS_PER_ROUTE

private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE
See Also:
Constant Field Values

DEFAULT_READ_TIMEOUT_MILLISECONDS

private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS
See Also:
Constant Field Values

httpClient

private HttpClient httpClient
Constructor Detail

HttpComponentsHttpInvokerRequestExecutor

public HttpComponentsHttpInvokerRequestExecutor()
Create a new instance of the HttpComponentsHttpInvokerRequestExecutor with a default HttpClient that uses a default org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.


HttpComponentsHttpInvokerRequestExecutor

public HttpComponentsHttpInvokerRequestExecutor(HttpClient httpClient)
Create a new instance of the HttpComponentsClientHttpRequestFactory with the given HttpClient instance.

Parameters:
httpClient - the HttpClient instance to use for this request executor
Method Detail

setHttpClient

public void setHttpClient(HttpClient httpClient)
Set the HttpClient instance to use for this request executor.


getHttpClient

public HttpClient getHttpClient()
Return the HttpClient instance that this request executor uses.


setConnectTimeout

public void setConnectTimeout(int timeout)
Set the connection timeout for the underlying HttpClient. A timeout value of 0 specifies an infinite timeout.

Parameters:
timeout - the timeout value in milliseconds

setReadTimeout

public void setReadTimeout(int timeout)
Set the socket read timeout for the underlying HttpClient. A timeout value of 0 specifies an infinite timeout.

Parameters:
timeout - the timeout value in milliseconds
See Also:
DEFAULT_READ_TIMEOUT_MILLISECONDS

doExecuteRequest

protected RemoteInvocationResult doExecuteRequest(HttpInvokerClientConfiguration config,
                                                  java.io.ByteArrayOutputStream baos)
                                           throws java.io.IOException,
                                                  java.lang.ClassNotFoundException
Execute the given request through the HttpClient.

This method implements the basic processing workflow: The actual work happens in this class's template methods.

Specified by:
doExecuteRequest in class AbstractHttpInvokerRequestExecutor
Parameters:
config - the HTTP invoker configuration that specifies the target service
baos - the ByteArrayOutputStream that contains the serialized RemoteInvocation object
Returns:
the RemoteInvocationResult object
Throws:
java.io.IOException - if thrown by I/O operations
java.lang.ClassNotFoundException - if thrown during deserialization
See Also:
createHttpPost(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration), setRequestBody(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration, HttpPost, java.io.ByteArrayOutputStream), executeHttpPost(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration, HttpClient, HttpPost), validateResponse(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration, HttpResponse), getResponseBody(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration, HttpResponse)

createHttpPost

protected HttpPost createHttpPost(HttpInvokerClientConfiguration config)
                           throws java.io.IOException
Create a HttpPost for the given configuration.

The default implementation creates a standard HttpPost with "application/x-java-serialized-object" as "Content-Type" header.

Parameters:
config - the HTTP invoker configuration that specifies the target service
Returns:
the HttpPost instance
Throws:
java.io.IOException - if thrown by I/O methods

setRequestBody

protected void setRequestBody(HttpInvokerClientConfiguration config,
                              HttpPost httpPost,
                              java.io.ByteArrayOutputStream baos)
                       throws java.io.IOException
Set the given serialized remote invocation as request body.

The default implementation simply sets the serialized invocation as the HttpPost's request body. This can be overridden, for example, to write a specific encoding and to potentially set appropriate HTTP request headers.

Parameters:
config - the HTTP invoker configuration that specifies the target service
httpPost - the HttpPost to set the request body on
baos - the ByteArrayOutputStream that contains the serialized RemoteInvocation object
Throws:
java.io.IOException - if thrown by I/O methods

executeHttpPost

protected HttpResponse executeHttpPost(HttpInvokerClientConfiguration config,
                                       HttpClient httpClient,
                                       HttpPost httpPost)
                                throws java.io.IOException
Execute the given HttpPost instance.

Parameters:
config - the HTTP invoker configuration that specifies the target service
httpClient - the HttpClient to execute on
httpPost - the HttpPost to execute
Returns:
the resulting HttpResponse
Throws:
java.io.IOException - if thrown by I/O methods

validateResponse

protected void validateResponse(HttpInvokerClientConfiguration config,
                                HttpResponse response)
                         throws java.io.IOException
Validate the given response as contained in the HttpPost object, throwing an exception if it does not correspond to a successful HTTP response.

Default implementation rejects any HTTP status code beyond 2xx, to avoid parsing the response body and trying to deserialize from a corrupted stream.

Parameters:
config - the HTTP invoker configuration that specifies the target service
response - the resulting HttpResponse to validate
Throws:
java.io.IOException - if validation failed

getResponseBody

protected java.io.InputStream getResponseBody(HttpInvokerClientConfiguration config,
                                              HttpResponse httpResponse)
                                       throws java.io.IOException
Extract the response body from the given executed remote invocation request.

The default implementation simply fetches the HttpPost's response body stream. If the response is recognized as GZIP response, the InputStream will get wrapped in a GZIPInputStream.

Parameters:
config - the HTTP invoker configuration that specifies the target service
httpResponse - the resulting HttpResponse to read the response body from
Returns:
an InputStream for the response body
Throws:
java.io.IOException - if thrown by I/O methods
See Also:
isGzipResponse(HttpResponse), GZIPInputStream

isGzipResponse

protected boolean isGzipResponse(HttpResponse httpResponse)
Determine whether the given response indicates a GZIP response.

The default implementation checks whether the HTTP "Content-Encoding" header contains "gzip" (in any casing).

Parameters:
httpResponse - the resulting HttpResponse to check
Returns:
whether the given response indicates a GZIP response