Pawel Ruta created OPENEJB-2010:
-----------------------------------

             Summary: 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.1, 4.5.0
         Environment: Windows 7 / Linux
            Reporter: Pawel Ruta
            Priority: Critical


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