Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Also, the JAX-WS specification allows for generation of asynchronous methods on generated proxies as well as using asynchronous methods on the Dispatch objects. These methods can take an AsyncHandler object and return a polling Future object so applications do not have to wait for the response. With the HttpURLConnection based transport, CXF was forced to consume a background thread for each outstanding request.

Apache HttpComponents 4.x

CXF also has an HTTP client transport that is based on the Apache HTTP Components HttpAsyncClient library. Its Maven artifactId is is cxf-rt-transports-http-hc. The HttpAsyncClient library uses a non-blocking IO model. This allows many more requests to be outstanding without consuming extra background threads. It also allows greater control over things like Keep-Alive handling which is very difficult or impossible with the HttpURLConnection based transport. However, the non-blocking model does not perform quite as well as the blocking model for pure synchronous request/response transactions.

By default, if the cxf-rt-transports-http-hc module is found on the classpath, CXF will use the HttpAsyncClient based implementation for any Async calls, but will continue to use the HttpURLConnection based transport for synchronous calls. This allows a good balance of performance for the common synchronous cases with scalability for the asynchronous cases. However, using a contextual property of "use.async.http.conduit" and set to true/false, you can control whether the async or blocking version is used. If "true", the HttpAsyncClient will be used even for synchronous calls, if "false", asynchronous calls will rely on the traditional method of using HTTPURLConnection along with a work queue to mimic the asynchronocityasynchronicity.  And if TLSClientParameters sets an SSLSocketFactory,  as SocketFactory class and SocketFactory#createSocket methods in particular are inherently blocking and sockets instantiated in such a way cannot be used for asynchronous, so this lead to use the HttpURLConnection based transport.

Another reason to use the asynchronous transport is to use HTTP methods that HttpURLConnection does not support. For example, the github.com REST API specifies the use of PATCH for some cases, but HttpURLConnection rejects PATCH.

Apache HttpComponents 5.x

Since 3.4.6, CXF offers an HTTP client transport that is based on Apache HttpComponents HttpClient 5 library, that supports synchronous, asynchronous and reactive programming models. Its Maven artifactId is cxf-rt-transports-http-hc5 and it serves as in-place replacement for cxf-rt-transports-http-hc (but the usage of those two transports together should be avoided).

Using the HTTP Components 4.x/5.x Transport from Java Code

To force global use of the HTTP Components transport, you can set a bus-level property:

...

Settings related to the underlying TCP socket (see java.net.Socket for a definition of these values):

org.apache.cxf.transport.http.async.TCP_NODELAY (Default true)

org.apache.cxf.transport.http.async.SO_KEEPALIVE

org.apache.cxf.transport.http.async.SO_LINGER

org.apache.cxf.transport.http.async.SO_TIMEOUT

Settings related to Keep-Alive connection management:

org.apache.cxf.transport.http.async.CONNECTION_TTL

Maximum time a connection to live(from creation to expiry) . Default is 60000.

org.apache.cxf.transport.http.async.MAX_CONNECTIONS

Maximum number of connections opened in total. Default is 5000.

org.apache.cxf.transport.http.async.MAX_PER_HOST_CONNECTIONS

Maximum number of connections opened per host. Default is 1000.

Settings related to Apache HttpAsyncClient threads and selectors:

org.apache.cxf.transport.http.async.ioThreadCount

Number of threads HttpAsyncClient uses to process IO events. Default is "-1" which means one thread per CPU core.

org.apache.cxf.transport.http.async.interestOpQueued (*)

true/false for whether the interest ops are queues or process directly.

org.apache.cxf.transport.http.async.selectInterval

Default 1000 ms. How often the selector thread wakes up if there are no events to process additional things like queue expirations.

* - for Apache HttpComponents 4.x only

Setting to control which conduit is used

org.apache.cxf.transport.http.async.usePolicy

ALWAYS, ASYNC_ONLY, NEVER.

Similar in meaning to the "use.async.http.conduit" context property described above. Whether to use the HttpAsyncClient: ALWAYS for both synchronous and asynchronous calls, ASYNC_ONLY (default) for asynchronous calls only, NEVER will use HTTPURLConnection for both types of calls.