[ 
https://issues.apache.org/jira/browse/CXF-4524?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13504933#comment-13504933
 ] 

metatech commented on CXF-4524:
-------------------------------

There seems to be a problem between the client-side and the server-side of the 
"Keep-Alive" mechanism.
If the keep-alive on a connection times out first on server-side, it closes the 
connection in a way that the client-side HttpUrlConnection does not detect that 
the connection is closed, and any subsequent request on this connection will 
generate a time-out after a very long time, typically 5 minutes if you have an 
Apache server between the CXF client and the server (indicated by an HTTP error 
400 in the logs). The 2 sides of the connection seem to wait for each other for 
several minutes.

Solutions : 
1. disable "keep-alive" (but with a potential performance overhead when many 
requests are sent in a loop to the same server), 
2. use Commons-Httpclient as HTTP client stack within CXF (implemented in CXF 
2.7.0 with CXF-4525/CXF-291)
3. define the Keep-Alive duration on the server (including intermediate Apache 
server) higher than the Keep-Alive duration on the client.

3.1. On the client-side, you can decrease the Keep-Alive duration :

On WebLogic, the java.net.HttpURLConnection implementation is not using the JVM 
built-in "sun.net.www.http" implementation, but is using a enhanced version by 
WebLogic, packaged as "weblogic.net.http".
Both have a "KeepAliveCache" class, which keeps opened HTTP connections in a 
pool for a few seconds, the exact number depending on the implementation :
sun.net.www.http.KeepAliveCache.LIFETIME = 5 seconds (cannot be overriden)
weblogic.net.http.KeepAliveCache.LIFETIME = 15 seconds (can be overriden with 
system property "http.keepAliveCache.lifeTime=5000" in milliseconds)

3.2. On the server-side, you can increase the Keep-Alive duration : 

3.2.1. Apache Server :
    KeepAlive On
    KeepAliveTimeout 5

3.2.2. WebLogic Server :
WebServerMBean.KeepAliveSecs : the value defines the keep-alive duration on the 
server-side, it can be changed in the WebLogic web console.  Default is 30 
seconds.

                
> Large request causes socket timeout on subsequent requests on WebLogic hosted 
> service
> -------------------------------------------------------------------------------------
>
>                 Key: CXF-4524
>                 URL: https://issues.apache.org/jira/browse/CXF-4524
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.6.2
>         Environment: WebLogic 10.3.0.0
>            Reporter: Chris Pimlott
>         Attachments: stacktrace.client.txt, stacktrace.weblogic.txt, 
> weblogic-socketTimeoutBug.zip
>
>
> I discovered an odd bug that appears to be some sort of interaction between 
> CXF, WebLogic and HTTP keepalives.  I have a simple service in a webapp 
> hosted in WebLogic 10.3.0.0.  I am hitting that service with a client stub 
> generated from WSDL by cxf-codegen-plugin.
> The steps are as follows:
> 1. Create a new client service object
> 2. Make a first call, passing a fairly large (1000) list of strings
> 3. Make a second call to any method
> The first call executes properly, but the second call fails with a socket 
> timeout.
> If the first call has a smaller or empty list of strings, the issue does not 
> occur.
> If you add a delay of approx. 5 seconds between the two calls, the issue does 
> not occur.  Shorter delays don't seem to be sufficient.
> If you disable HTTP keepalives, either on the client (via System property) or 
> on the server, the issue does not occur.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to