web-dev-qa-db-ja.com

クライアント中止リクエストの検出ジャージー

私はジャージーに安らかなウェブサービスを提供させています。ここで説明されているようなajaxabortメソッドを使用して、クライアントが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
13
LMG

中止された要求は、Tomcatアクセスログに記録する必要があります。その中にすべてのリクエストと関連するレスポンスコードがあります。

ただし、問題はシステムの制限に関連している可能性があります。ジャージーでは、サーバーへのリクエストごとに、I/Oコンテナがレスポンスライターの新しいインスタンスを送信するため、etc/security/limits.confにあるオペレーティングシステムの制限を確認する必要があります。言及されたファイルには、ドメイン、タイプ、および値フィールドが含まれています。

ドメインには、ユーザー名、グループ名、または任意のワイルドカードを使用できます。 type filedには、(softまたはhard)、softソフト制限を適用する場合、hardハード制限を適用する場合の2つの値を指定できます。値フィールドはドメインの制限を定義します:)Tomcatユーザーの制限を増やすと、問題は解決すると思います。

Tomcatのサンプル設定

Tomcatソフトnofile102400

Tomcatハードnofile102400

Tomcatソフトnproc102400

Tomcatハードnproc102400

4
serkan kucukbay