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

Romain Manni-Bucau commented on OPENEJB-2010:
---------------------------------------------

yes, the KeepAliveServer handles in a far more better way.
                
> OpenEJB Http - Connection reset (4.5.0, 4.5.1)
> ----------------------------------------------
>
>                 Key: OPENEJB-2010
>                 URL: https://issues.apache.org/jira/browse/OPENEJB-2010
>             Project: OpenEJB
>          Issue Type: Bug
>          Components: server
>    Affects Versions: 4.5.0, 4.5.1
>         Environment: Windows 7 / Linux
>            Reporter: Pawel Ruta
>            Priority: Critical
>         Attachments: OpenEJBHttpServer.java
>
>
> Randomly I'm getting "java.net.SocketException: Connection reset" exception 
> when using OpenEJB embedable as a server for Statless Web Services (CXF 
> implementation) and CXF WS client. On some computers it never happens, on 
> some almost always, on some randomly. It happens (randomly) when SOAP Message 
> generated by a server is more than 8192 bytes in size (related to buffer size 
> in SocketInputStream.java). 
> I've noticed that in OpenEJBHttpServer.java 
> (org.apache.openejb.server.httpd.OpenEJBHttpServer), method service(Socket 
> socket) you are closing OutputStream immediatelly after flushing data. 
> Closing OutputStream means also closing socket. Closing socket means 
> "Connection reset" if client isn't fast enough to recieving data from socket. 
> Client-server communication using ServerSocket and Socket is a bit tricky. In 
> ideal situation client should report that it is ending the comunication and 
> then server shoudl close socket. That's not a case for HttpServer. I propose 
> the solution to wait for client to close socket (all good implementation of 
> client will close socket :) ). We can wait (non-blocking) for client closing 
> socket by reading InputStream. When client close connection then InputStream 
> returns -1. If client doesn't responde connection timeout occur (default is 
> 60 seconds I suppose). 
> I've attached changed sources. The solution is quick (dirty). Probably the 
> more sophisticated approach for managing resource (threads, sockets) should 
> be used. 
> Reported exception, full stack: 
> javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: Connection reset 
> at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156) 
> Caused by: javax.xml.bind.UnmarshalException 
> with linked exception: 
> [com.ctc.wstx.exc.WstxIOException: Connection reset] 
> at 
> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:426)
>  
> at 
> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362)
>  
> at 
> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339)
>  
> at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:784)
>  
> at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:97) 
> at org.apache.cxf.jaxb.JAXBEncoderDecoder$1.run(JAXBEncoderDecoder.java:812) 
> at java.security.AccessController.doPrivileged(Native Method) 
> at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:810)
>  
> at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:644)
>  
> at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157) 
> at 
> org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
>  
> at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
>  
> at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801) 
> at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1694)
>  
> at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1530)
>  
> at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1438)
>  
> at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
> at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:660) 
> at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
>  
> at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
>  
> at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531) 
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464) 
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367) 
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320) 
> at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89) 
> at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) 
> ... 36 more 
> Caused by: com.ctc.wstx.exc.WstxIOException: Connection reset 
> at com.ctc.wstx.sr.StreamScanner.constructFromIOE(StreamScanner.java:631) 
> at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:999) 
> at com.ctc.wstx.sr.StreamScanner.getNext(StreamScanner.java:759) 
> at 
> com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2662) 
> at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1048) 
> at 
> com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:192)
>  
> at 
> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360)
>  
> ... 60 more 
> Caused by: java.net.SocketException: Connection reset 
> at java.net.SocketInputStream.read(SocketInputStream.java:168) 
> at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
> at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 
> at java.io.BufferedInputStream.read(BufferedInputStream.java:317) 
> at sun.net.www.MeteredStream.read(MeteredStream.java:116) 
> at java.io.FilterInputStream.read(FilterInputStream.java:116) 
> at 
> sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2672)
>  
> at com.ctc.wstx.io.BaseReader.readBytes(BaseReader.java:155) 
> at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:368) 
> at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:111) 
> at com.ctc.wstx.io.MergedReader.read(MergedReader.java:105) 
> at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:87) 
> at 
> com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:57) 
> at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:993) 
> ... 65 more

--
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