[ https://issues.apache.org/jira/browse/OPENEJB-2010?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13613740#comment-13613740 ]
Romain Manni-Bucau commented on OPENEJB-2010: --------------------------------------------- commited something close to your fix on trunk (if you can give a try) > 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