Gen Java EJB Web Service call timeout at 60 seconds (JBoss/WildFly)
search cancel

Gen Java EJB Web Service call timeout at 60 seconds (JBoss/WildFly)

book

Article ID: 188942

calendar_today

Updated On:

Products

Gen Gen - Run Time Distributed

Issue/Introduction

Developing a new Gen app, which is generated and compiled as Java.
The app is cooperative packaged.
The client are generated as: JVM/Java/INTERNET
The servers are generated as: JVM/JAVA/EJB Web services/Oracle/Java RMI
The Application Server is jboss/wildfly-14.0.1.Final

There are some servers that do quite a lot of processing, so the EJB request can take a lot to complete and sometimes a timeout error occurs i.e.

===
09:58:39,674 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (com.ca.gen85.smrt.ServletSession) Interceptor for {http://tempuri.org/.../...#{http://cxf.apache.org/jaxws/dispatch}Invoke has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Could not receive Message.
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:65)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:537)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:446)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:361)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
        at org.apache.cxf.endpoint.ClientImpl.invokeWrapped(ClientImpl.java:354)
        at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:322)
        at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:241)
        at com.ca.gen85.odc.coopflow.ws.WSDynamicCoopFlow.doFlow(Unknown Source)
...
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://localhost:8080/.../.../...: Read timed out
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1402)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1386)
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:673)
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
        ... 43 more
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
  ...
  at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
        at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream$2.run(URLConnectionHTTPConduit.java:377)
        at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream$2.run(URLConnectionHTTPConduit.java:373)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:373)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.doProcessResponseCode(HTTPConduit.java:1599)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1627)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1572)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1373)
        ... 46 more
  
09:58:39,685 INFO  [stdout] (com.ca.gen85.smrt.ServletSession) 04/16/20-09:58:39:685[com.ca.gen85.smrt.ServletSession]: WSDynamicCoopFlow.processException.WS.Exception(): Read timed out
===

The timeout seems to be 60 seconds, How can the timeout be increased?

Environment

Gen Enterprise Java Beans (EJB) Web Services

Cause

This is a web service call where JBoss/WildFly uses Apache CXF which itself has a client side receive timeout parameter ReceiveTimeout that defaults to 60000 milliseconds i.e. 60 seconds: Apache CXF > Client HTTP Transport (including SSL support) > The client element
"ReceiveTimeout: Specifies the amount of time, in milliseconds, that the client will wait for a response before it times out. The default is 60000.
0 specifies that the client will wait indefinitely."

Resolution

The Apache CXF/HTTPConduit timeouts can be configured in WildFly as system properties per WildFly 14 Developer Guide: WildFly Developer Guide
See section "HTTPConduit configuration"
cxf.client.receiveTimeout corresponds to the ReceiveTimeout.

The environment variable JAVA_OPTS in file standalone.conf (or under Windows standalone.conf.bat) was used to set the system property "cxf.client.receiveTimeout" to 900 seconds (15 minutes) i.e.
JAVA_OPTS=-Dcxf.client.receiveTimeout=900000

It was also found that 2 additional timeout settings needed to be set as follows:
1. In standalone.xml, for the datasource definition set the idle timeout to 15 minutes:
                    <timeout>
                        <idle-timeout-minutes>15</idle-timeout-minutes>
                    </timeout>
3. In standalone.xml, add <coordinator-environment default-timeout="900" /> to this existing section to set the transaction timeout to 900 seconds (15 minutes):
        <subsystem xmlns="urn:jboss:domain:transactions:5.0">
            <core-environment node-identifier="${jboss.tx.node.id:1}">
                <process-id>
                    <uuid/>
                </process-id>
            </core-environment>
            <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
            <object-store path="tx-object-store" relative-to="jboss.server.data.dir"/>
            <coordinator-environment default-timeout="900" />
        </subsystem>

Additional Information

NOTE: Gen 8.5 is now EOS as of June 30, 2021 and only officially supported JBoss Application Server 5.1
Gen 8.6 is currently officially supported with JBoss EAP Application Server. More details here:
Gen™ 8.5
Gen™ 8.6 Technical Requirements > Third-Party Software Version