2014-04-09 124 views
10

我有Jersey提供restfull web服务。经常发生客户端中止通过ajax完成请求,使用ajax abort方法在这里解释abort ajax request检测客户端中止请求Jersey

在服务器端,我得到以下输出。哪个不好看。有没有办法在Jersey中检测到中止的请求?

SEVERE: An I/O error has occurred while writing a response message entity to the container output stream. 
org.glassfish.jersey.server.internal.process.MappableException: ClientAbortException: java.net.SocketException: Broken pipe 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:96) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:368) 
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:319) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: ClientAbortException: java.net.SocketException: Broken pipe 
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:364) 
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:326) 
    at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101) 
    at org.glassfish.jersey.message.internal.CommittingOutputStream.flush(CommittingOutputStream.java:292) 
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1086) 
    at com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:544) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:263) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88) 
    ... 37 more 
Caused by: java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159) 
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215) 
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480) 
    at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:119) 
    at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:793) 
    at org.apache.coyote.Response.action(Response.java:173) 
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:359) 
    ... 48 more 
+0

请参阅http://stackoverflow.com/a/39006980/142446 –

回答

5

中止的请求必须记录在tomcat访问日志中。您可以在其中找到所有请求和相关响应代码。

但您的问题可能与系统限制有关。在运动衫中,对于每个服务器请求,I/O容器都会发送响应写入器的新实例 ,因此您应该检查位于etc/security/limits.conf的操作系统限制。 提及的文件包含域,类型和值字段。

域可以是用户名,组名或任何通配符。 类型字段可以具有两个值(软或硬), 用于执行软限制,用于执行硬限制。 值域被定义为域的限制:) 我想如果你增加对tomcat用户的限制,问题就解决了。

样品CONF为Tomcat

Tomcat的软NOFILE 102400

Tomcat的硬NOFILE 102400

Tomcat的软NPROC 102400

Tomcat的硬NPROC 102400

+0

所以,我无法检测客户端中止请求?这是你在说什么......? – LMG

+0

这个问题与你的基于tomcat的**配置**有关。当你的服务器在**重载**时,操作系统不能创建任何进程/文件并将其分配给tomcat。而球衣引发异常,为了克服这个问题,你应该在服务器端增加这些设置。该配置文件位于服务器中的** etc/security/limits.conf **处。 –

+1

但你没有回答这个问题,我怎么能禁用日志到Tomcat ...我有同样的问题,球衣登录在tomcat的异常,当用户中止请求,并且我想禁用此日志,因为我的客户可以放弃他的请求,并且我可以。 所以...我如何检测客户端中止请求在泽西岛和禁用日志到tomcat ... – sidanmor