Author: buildbot
Date: Wed May 25 07:47:32 2016
New Revision: 989092
Log:
Production update by buildbot for cxf
Modified:
websites/production/cxf/content/cache/docs.pageCache
websites/production/cxf/content/docs/asynchronous-client-http-transport.html
Modified: websites/production/cxf/content/cache/docs.pageCache
==============================================================================
Binary files - no diff available.
Modified:
websites/production/cxf/content/docs/asynchronous-client-http-transport.html
==============================================================================
---
websites/production/cxf/content/docs/asynchronous-client-http-transport.html
(original)
+++
websites/production/cxf/content/docs/asynchronous-client-http-transport.html
Wed May 25 07:47:32 2016
@@ -116,7 +116,7 @@ Apache CXF -- Asynchronous Client HTTP T
<td height="100%">
<!-- Content -->
<div class="wiki-content">
-<div id="ConfluenceContent"><h1
id="AsynchronousClientHTTPTransport-AsynchronousClientHTTPTransport">Asynchronous
Client HTTP Transport</h1><p>By default, CXF uses a transport based on the
in-JDK HttpURLConnection object to perform HTTP requests. The HttpURLConnection
object uses a blocking model for all IO operations which requires a per-thread
execution model. From a pure performance standpoint, this model generally
performs very well, but it does have problems scaling when many requests need
to be executed simultaneously.</p><p>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.</p><p>CXF also has an HTTP client transport
that is based on the <a shape="rect" class="external-link"
href="http://hc.apache.org/httpcomponents-asyncclient-dev/index.html">Apache
HTTP Components HttpAsyncClient</a> library. Its Maven artifactId is <span
style="line-height: 1.4285715;">cxf-rt-transports-http-hc.</span><span
style="line-height: 1.4285715;"> 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.</span></p><p>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
asynchronocity.</p><p>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.</p><h3
id="AsynchronousClientHTTPTransport-UsingtheHTTPComponentsTransportfromJavaCode">Using
the HTTP Components Transport from Java Code</h3><p>To force global use of the
HTTP Components transport, you can set a bus-level property:</p><div class="cod
e panel pdl" style="border-width: 1px;"><div class="codeContent panelContent
pdl">
+<div id="ConfluenceContent"><h1
id="AsynchronousClientHTTPTransport-AsynchronousClientHTTPTransport">Asynchronous
Client HTTP Transport</h1><p>By default, CXF uses a transport based on the
in-JDK HttpURLConnection object to perform HTTP requests. The HttpURLConnection
object uses a blocking model for all IO operations which requires a per-thread
execution model. From a pure performance standpoint, this model generally
performs very well, but it does have problems scaling when many requests need
to be executed simultaneously.</p><p>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.</p><p>CXF also has an HTTP client transport
that is based on the <a shape="rect" class="external-link"
href="http://hc.apache.org/httpcomponents-asyncclient-dev/index.html">Apache
HTTP Components HttpAsyncClient</a> library. Its Maven artifactId is <span
style="line-height: 1.4285715;">cxf-rt-transports-http-hc.</span><span
style="line-height: 1.4285715;"> 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.</span></p><p>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 asynchronocity. 
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.</p><p>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.</p><h3
id="AsynchronousClientHTTPTransport-UsingtheHTTPComponentsTransportfromJavaCode">Using
the HTTP Components Transport from Java Code</h3><p>To force global use of the
HTTP Components transport, you can set a bus-level property:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> Bus bus = BusFactory.getDefaultBus();
// insist on the async connector to use PATCH.
bus.setProperty(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE);</pre>
@@ -127,7 +127,7 @@ Apache CXF -- Asynchronous Client HTTP T
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">Credentials creds = new NTCredentials("username",
"pswd", null, "domain");
bp.getRequestContext().put(Credentials.class.getName(), creds);
</pre>
-</div></div></li></ul><h3
id="AsynchronousClientHTTPTransport-Configuration">Configuration</h3><p>The
Asynchronous HTTP Transport has several options that can set using Bus
properties or via the OSGi configuration services to control various aspects of
the underlying Apache HTTP Components HttpAsyncClient objects.</p><p>Settings
related to the underlying TCP socket (see <a shape="rect" class="external-link"
href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html"
rel="nofollow">java.net.Socket</a> for a definition of these values):</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><td colspan="1"
rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.TCP_NODELAY
(Default true)</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.SO_KEEPALIVE</p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.SO_LINGER</p></td></tr><tr><td
colspan="
1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.SO_TIMEOUT</p></td></tr></tbody></table></div><p>Settings
related to Keep-Alive connection management:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.CONNECTION_TTL</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Maximum time a connection
which is released and not used <span>in the pool</span>. Default is
60000.</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.MAX_CONNECTIONS</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>Maximum number of
connections opened in total. Default is 5000.</span></p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.MAX_PER_HOST_CONNECTIONS</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>Maximum number of
connections op
ened per host. Default is
1000.</span></p></td></tr></tbody></table></div><p>Settings related to Apache
HttpAsyncClient threads and selectors:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.ioThreadCount</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Number of threads
HttpAsyncClient uses to process IO events. Default is "-1" which means one
thread per CPU core.</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.interestOpQueued</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>true/false for whether the
interest ops are queues or process directly.</p></td></tr><tr><td colspan="1"
rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.selectInterval</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Default 1000 ms. How often the
selector thread wakes up if there are no eve
nts to process additional things like queue
expirations.</p></td></tr></tbody></table></div><p>Setting to control which
conduit is used</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.usePolicy</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>ALWAYS, ASYNC_ONLY,
NEVER.</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>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.</p></td></tr></tbody></table></div></div>
+</div></div></li></ul><h3
id="AsynchronousClientHTTPTransport-Configuration">Configuration</h3><p>The
Asynchronous HTTP Transport has several options that can set using Bus
properties or via the OSGi configuration services to control various aspects of
the underlying Apache HTTP Components HttpAsyncClient objects.</p><p>Settings
related to the underlying TCP socket (see <a shape="rect" class="external-link"
href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html"
rel="nofollow">java.net.Socket</a> for a definition of these values):</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><td colspan="1"
rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.TCP_NODELAY
(Default true)</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.SO_KEEPALIVE</p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.SO_LINGER</p></td></tr><tr><td
colspan="
1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.SO_TIMEOUT</p></td></tr></tbody></table></div><p>Settings
related to Keep-Alive connection management:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.CONNECTION_TTL</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Maximum time a connection to
live(from creation to expiry)<span> </span>. Default is
60000.</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.MAX_CONNECTIONS</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>Maximum number of
connections opened in total. Default is 5000.</span></p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.MAX_PER_HOST_CONNECTIONS</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><span>Maximum number of
connections opened
per host. Default is
1000.</span></p></td></tr></tbody></table></div><p>Settings related to Apache
HttpAsyncClient threads and selectors:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.ioThreadCount</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Number of threads
HttpAsyncClient uses to process IO events. Default is "-1" which means one
thread per CPU core.</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.interestOpQueued</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>true/false for whether the
interest ops are queues or process directly.</p></td></tr><tr><td colspan="1"
rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.selectInterval</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Default 1000 ms. How often the
selector thread wakes up if there are no events
to process additional things like queue
expirations.</p></td></tr></tbody></table></div><p>Setting to control which
conduit is used</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>org.apache.cxf.transport.http.async.usePolicy</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>ALWAYS, ASYNC_ONLY,
NEVER.</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>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.</p></td></tr></tbody></table></div></div>
</div>
<!-- Content -->
</td>