This article walks through the configuration of a JAX-WS Client timeout for applications running on WildFly or JBoss Enterprise application Platform
Pre-requisites: You should be able to deploy a JAX-WS Web Service on WildFly. Read this article to learn more: SOAP Web services on WildFly made simple
There are two types of time-out in relation to SOAP Clients:
- ConnectionTimeout: this is the amount of time (in ms) that the client will attempt to establish a connection. The default is 30000 (30 seconds). 0 specifies that the client will have no timeout.
- ReceiveTimeout: this is the amount of time (in s) that the client will wait for a response before it times out. The default is 60000. 0 specifies that the client will have no timeout.
To set the above time-outs, you can use the following properties:
# Jakarta EE 8 javax.xml.ws.client.connectionTimeout javax.xml.ws.client.receiveTimeout # Jakarta EE 9/10 jakarta.xml.ws.client.connectionTimeout jakarta.xml.ws.client.receiveTimeout
An example code
The following code example, shows how to set a 5 minutes Receive Timeout to connect to a SOAP Web service:
@Test public void testTimeoutConfigutation() throws Exception { SOAPService service = new SOAPService(); assertNotNull(service); Greeter greeter = service.getPort(portName, Greeter.class); updateAddressPort(greeter, PORT); ((javax.xml.ws.BindingProvider)greeter).getRequestContext().put("javax.xml.ws.client.receiveTimeout", 5 * 60 * 1000); try { greeter.greetMe("test"); // remove fail() check to let this test pass in the powerful machine } catch (Throwable ex) { Object cause = null; if (ex.getCause() != null) { cause = ex.getCause(); } assertTrue("Timeout cause is expected", cause instanceof java.net.SocketTimeoutException); } }
If a time-out occurs, you will see the following exception at Runtime:
2016-07-20 07:24:01 - Error getting response; java.net.SocketTimeoutException: Read timed out
Setting the Timeout globally
The above example, applies the timeout for a single application. To set them globally, you can use the following System Properties:
- cxf.client.connectionTimeout for ConnectionTimeout
- cxf.client.receiveTimeout for ReceiveTimeout
For example, you can add them to your standalone.xml configuration as follows:
<system-properties> <property name="cxf.client.connectionTimeout" value="90000"/> <property name="cxf.client.receiveTimeout" value="120000"/> </system-properties>
Configuring the timeout with Apache CXF
If you are using directly the Apache CXF API for your Clients, then you can use the org.apache.cxf.transports.http.configuration.HTTPClientPolicy to set the Client Timeout. Example:
public static WebClient createWebClient( String url, long connectTimeout, long receiveTimeout, int maxRetries ) { WebClient client = WebClient.create( url ); HTTPConduit httpConduit = ( HTTPConduit ) WebClient.getConfig( client ).getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout( connectTimeout ); httpClientPolicy.setReceiveTimeout( receiveTimeout ); httpClientPolicy.setMaxRetransmits( maxRetries ); httpConduit.setClient( httpClientPolicy ); return client; }
Finally, remember that in order to use Apache CXF libraries in your applications you need to add the dependencies for org.apache.cxf and org.apache.cxf.impl. For example, you can do that in jboss-deployment-structure.xml:
<?xml version="1.0"?> <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <deployment> <dependencies> <module name="org.apache.cxf" /> <module name="org.apache.cxf.impl" /> </dependencies> </deployment> </jboss-deployment-structure>