繁体   English   中英

服务器端处理丢失的客户端连接(由对等方重置)?

[英]Server-side handling missing client connection (reset by peer)?

我有一个网络服务和一个客户端。 有时,客户端会连接,而不会立即获得返回值。 稍后,如果从WS返回了一个值,并且与此同时客户端已关闭,则我将收到不知道如何处理的异常。

我如何才能捕获由于对等异常而导致的重置,以使Web服务器不会崩溃?

@Webservice
class MyWebservice {
    public boolean myWebserviceMethod() {
        //sleep, cut the client, then return.
        return false;
    }   
}

Okt 02,2012 2:26:52 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging

Warnung: Interceptor for {http://myproject.de/wsdl}ConnectionService#{http://myproject.de/wsdl}myWebserviceMethod has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211)
    at org.apache.openejb.server.cxf.CxfWsContainer.onMessage(CxfWsContainer.java:73)
    at org.apache.openejb.server.webservices.WsServlet.service(WsServlet.java:98)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:346)
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:306)
    at org.apache.catalina.connector.Response.flushBuffer(Response.java:568)
    at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:307)
    at org.apache.openejb.server.httpd.ServletResponseAdapter.flushBuffer(ServletResponseAdapter.java:205)
    at org.apache.cxf.transport.http.AbstractHTTPDestination$WrappedOutputStream.close(AbstractHTTPDestination.java:684)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.AbstractHTTPDestination$BackChannelConduit.close(AbstractHTTPDestination.java:626)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    ... 24 more
Caused by: java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
    at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:119)
    at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:789)
    at org.apache.coyote.Response.action(Response.java:174)
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:341)
    ... 32 more

服务器确实崩溃了吗?还是您(错误地)通过见证堆栈跟踪来断定服务器崩溃了?

之所以有堆栈跟踪,是因为Catalina无法将响应写入已打开以与客户端进行通信的套接字。 在这种情况下,总是会出现此异常; 卡塔琳娜(Catalina)无法确切知道为什么它不能写入套接字-它所知道的就是它不能写入响应。 它打印堆栈跟踪信息(因为这是一个错误情况,可能对系统管理员来说很有价值,例如,出于性能调整的目的),然后继续进行操作。

如果确实发生这种情况,则服务器确实崩溃了,那么您可能会遇到更大的问题。 我发现很难相信,如果服务器无法对死的TCP / IP套接字写入响应,服务器实际上就会崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM