web-dev-qa-db-ja.com

RESTEasy例外:RESTEASY003770:応答がコミットされ、例外を処理できません

RESTEasyサーバーから奇妙な例外が発生します。これは、特に大きな応答がクライアントに返されるときに発生します。

例外は、コードが結果オブジェクトをRESTEasyに返した後に発生するため、すべてRESTEasyレイヤー内にあります。サーバーはTomcatです。

小さな応答で問題ありませんが、大きな応答がエラーを引き起こしています。これは、JSONまたはXMLを返す場合に発生し、返されるオブジェクトのコンテンツではなく、応答のサイズによってトリガーされます。

探してみましたが、まだ何も役に立っていないので、この時点でかなり迷っています。

org.jboss.resteasy.spi.UnhandledException: RESTEASY003770: Response is committed, can't handle exception
        at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.Java:174)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.Java:478)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:422)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:209)
        at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.Java:221)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:56)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:51)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:292)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:207)
        at org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:240)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:207)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:212)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:106)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:141)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:79)
        at org.Apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.Java:616)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:88)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:522)
        at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1095)
        at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:672)
        at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1502)
        at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1458)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
        at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
        at Java.lang.Thread.run(Thread.Java:745)
Caused by: org.Apache.catalina.connector.ClientAbortException: Java.io.IOException: Broken pipe
        at org.Apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.Java:393)
        at org.Apache.Tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.Java:426)
        at org.Apache.Tomcat.util.buf.ByteChunk.append(ByteChunk.Java:339)
        at org.Apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.Java:418)
        at org.Apache.catalina.connector.OutputBuffer.write(OutputBuffer.Java:406)
        at org.Apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.Java:97)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.write(HttpServletResponseWrapper.Java:46)
        at org.jboss.resteasy.util.CommitHeaderOutputStream.write(CommitHeaderOutputStream.Java:71)
        at org.jboss.resteasy.util.DelegatingOutputStream.write(DelegatingOutputStream.Java:48)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.Java:2003)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.Java:1049)
        at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.writeTo(ResteasyJackson2Provider.Java:209)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.Java:131)
        at org.jboss.resteasy.core.interception.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.Java:60)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.Java:120)
        at org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.Java:100)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.Java:124)
        at org.jboss.resteasy.plugins.interceptors.encoding.ServerContentEncodingAnnotationFilter.aroundWriteTo(ServerContentEncodingAnnotationFilter.Java:60)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.Java:124)
        at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.Java:98)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.Java:473)
        ... 27 more
Caused by: Java.io.IOException: Broken pipe
        at Sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at Sun.nio.ch.SocketDispatcher.write(SocketDispatcher.Java:47)
        at Sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.Java:93)
        at Sun.nio.ch.IOUtil.write(IOUtil.Java:65)
        at Sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.Java:471)
        at org.Apache.Tomcat.util.net.NioChannel.write(NioChannel.Java:124)
        at org.Apache.Tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.Java:101)
        at org.Apache.Tomcat.util.net.NioSelectorPool.write(NioSelectorPool.Java:172)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.Java:139)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.flushBuffer(InternalNioOutputBuffer.Java:244)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.Java:189)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.access$000(InternalNioOutputBuffer.Java:41)
        at org.Apache.coyote.http11.InternalNioOutputBuffer$SocketOutputBuffer.doWrite(InternalNioOutputBuffer.Java:320)
        at org.Apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.Java:93)
        at org.Apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.Java:256)
        at org.Apache.coyote.Response.doWrite(Response.Java:501)
        at org.Apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.Java:388)
        ... 47 more

更新:実際にこれが再び発生しました!以下のスコットの回答は最初のケースをカバーしていましたが、2回目は応答ヘッダーにnull値を挿入することによるものでした。RESTEasyは、挿入時にnullヘッダー値を受け入れました。しかし、私のコードを終了した後に応答をシリアル化しようとしたときに失敗しました。

8
Roy Wood

さて、これを数回経験してきた-問題があるときにこの動作を私は個人的に見てきたフロントエンドリバースプロキシを使用する場合使用している場合。たとえば、nginxを使用してシステムがデプロイされ、さまざまなユーザーで実行されている場合に問題が発生しました。一時ディレクトリの権限の問題は、応答が特定のサイズに達するまで問題が表示されない可能性があることを意味します。例(1行ですが、改行は見やすくするためのものです):

2017-04-20T17:46:40.03987 [nginx] 2017/04/20 13:46:40 [crit] 64537#0: 
  *14195 open() "/usr/local/var/run/nginx/proxy_temp/6/43/0000000436" 
  failed (13: Permission denied) while reading upstream, client: 10.0.0.1, 
  server: foo.bar.com, request: "GET /this/awesome/endpoint HTTP/1.1", 
  upstream: "http://127.0.0.1:9999/this/awesome/endpoint", Host: "foo.bar.com"
5
Caused by: org.Apache.catalina.connector.ClientAbortException: Java.io.IOException: Broken pipe

応答が完全に送信される前にクライアントが接続を閉じているようです。クライアントのタイムアウトを増やしてから確認してください。

1
gladiator