【问题标题】:Detecting client-aborting request Jersey检测客户端中止请求泽西岛
【发布时间】:2014-05-22 16:02:35
【问题描述】:

我让 Jersey 提供了一个完整的网络服务。经常发生客户端通过 ajax 中止请求的情况,这里解释了 ajax 中止方法abort ajax request

在服务器端,我得到以下输出。这不是很好看。有没有办法检测泽西岛中止的请求?

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

【问题讨论】:

标签: java jquery ajax tomcat7 jersey-2.0


【解决方案1】:

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

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

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

tomcat 的示例配置

tomcat 软文件 102400

tomcat hard nofile 102400

tomcat 软 nproc 102400

tomcat 硬 nproc 102400

【讨论】:

  • 所以,我无法检测到客户端中止请求?这就是你的意思……?
  • 问题与您基于tomcat的配置有关。当您的服务器在重负载下,操作系统无法创建和分配任何进程/文件给tomcat。并且球衣抛出了提到的异常,为了克服这个问题,你应该在服务器端增加这些设置。此配置文件位于您服务器的 etc/security/limits.conf 中。
  • 但是您没有回答问题如何禁用到 Tomcat 的日志...我有同样的问题,当用户中止请求时,球衣将异常记录在 tomcat 中,我想要禁用此日志,因为我的客户可以中止他的请求,我可以。所以...我如何在 Jersey 中检测到客户端中止请求并禁用日志到 tomcat...
  • 问题不在于禁用日志tomact,一旦你可以拦截这样的事件,你就可以避免它被写入日志。我希望能够在调用者中止请求时完全停止正在进行的处理工作:这样可以节省一些计算,这可能会变成更多资源供其他客户端使用..
  • @LMG 所以...你能回答这个问题吗??? stackoverflow.com/questions/32494699/…
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2011-02-08
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多