繁体   English   中英

dropwizard org.eclipse.jetty.io.EofException:早期的EOF异常

[英]dropwizard org.eclipse.jetty.io.EofException: Early EOF exception

我在某些要求下收到以下异常。 这种情况很少发生,像一周一次或两次。 任何想法可能导致此问题,或者关于调试该调试工具的建议。

Dropwizard版本:1.1.4码头服务器版本:2.25.1

该错误发生在下面的代码行中:request.bufferEntity()

private String getBody(ContainerRequestContext requestContext) {
        if (requestContext instanceof ContainerRequest) {
            ContainerRequest request = (ContainerRequest) requestContext;
            // calling bufferEntity(), without this the entity is marked as closed and causes IllegalStateExceptions
            // on any subsequent read attempt
            request.bufferEntity();
            return request.readEntity(String.class);
        } else {
            // this should never happen as we are using jersey as the jax-rs implementation engine
            throw new RuntimeException("ContainerRequestContext is not an instance of jersey ContainerRequest");
        }
    }

无法缓冲消息内容输入流。 在org.glassfish.jersey.server.ContainerFilteringStage上的org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:132)上的org.glassfish.jersey.message.internal.InboundMessageContext.bufferEntity(InboundMessageContext.java:931) .apply(ContainerFilteringStage.java:68)在org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)在org.glassfish.jersey.server.ServerRuntime $ 2.run(ServerRuntime.java:318)在org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:271)在org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:267)在org.glassfish.jersey.internal.Errors在org.glassfish.jersey.internal.Errors.process(Errors.java:297)在org.glassfish.jersey.internal.Errors.process(Errors.java:267)处的.process(Errors.java:315)。在org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)处的glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)在org.glassfish.jersey.server.ApplicationHandler.handle(应用领域 org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)的org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)的nHandler.java:1154) org.glassfish.jersey.servlet.Servlet.ServletContainer.service(ServletContainer.java:341)上的.servlet.ServletContainer.service(ServletContainer.java:388)org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) )在org.eclipse.jetty的org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)的org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)处。 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)上的server.handler.ScopedHandler.handle(ScopedHandler.java:141),com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler。 java:241)位于io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:52)位于org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:454)位于io.d org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169)上的ropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:68)在org.eclipse.jetty.server.handler.HandlerWrapper.handle( org.eclipse.jetty.server.Server.handle(Handler.rapper.java:132)org.eclipse.jetty.server.Http.Channel.handle(HttpChannel.java:317)(org.eclipse.jetty)(Server.java:564) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1444)上的.server.HttpChannelOverHttp.earlyEOF(HttpChannelOverHttp.java:239)在org.eclipse.jetty.server.HttpConnection.parseRequestBuffer(HttpConnection.java:351 )在org.eclipse.jetty.io的org.eclipse.jetty.io.AbstractConnection $ ReadCallback.succeeded(AbstractConnection.java:279)的org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:234)处。在org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:289)处的FillInterest.fillable(FillInterest.java:110)在org.eclipse.jetty.io.ssl.SslConnection处的$ 3.succeeded(SslConnection.java) : 149),位于org.eclipse.jetty.io.ChannelEndPoint $ 2.run(ChannelEndPoint.java:124),位于org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)。 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill处的thread.Invocable.invokePreferred(Invocable.java:128)(位于org.eclipse.jetty.util.thread.Invocable $ InvocableExecutor.invoke(Invocable.java:222)) org.eclipse.jetty.util.thread.strategy上的doProduce(EatWhatYouKill.java:294).org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java: 673)at org.eclipse.jetty.util.thread.QueuedThreadPool $ 2.run(QueuedThreadPool.java:591)at java.lang.Thread.run(Thread.java:748)原因:org.eclipse.jetty.io。 EofException:在org.eclipse.jetty.server.HttpInput $ 3.noContent(HttpInput.java:1093)的org.eclipse.jetty.server.HttpInput $ 3.getError(HttpInput.java:1104)的早期EOF .java.io.InputStream.read(InputStream.j上的.server.HttpInput.read(HttpInput.java:307) ava:101)在org.glassfish.jersey.message.internal.ReaderWriter.writeTo(ReaderWriter.java:115)在org.glassfish.jersey.message.internal.InboundMessageContext.bufferEntity(InboundMessageContext.java:918)... 68通用框架省略

此问题在1.3.8仍然存在,并且是一个未解决的问题

好。 似乎有一种解决方法。 您可以创建一个过滤器类来过滤异常并检查Eof。 这是针对我的情况的一种具体技巧。 但是,您明白了。 我已经对此进行了测试,并且可以正常工作。 这是过滤器代码段。


  @Override
  public void doFilter(
      final ServletRequest request,
      final ServletResponse response,
      final FilterChain chain)
      throws IOException, ServletException {
    try {
      chain.doFilter(request, response);
    } catch (ServletException e) {
      if (isEarlyEofException(e)) {
        log.debug("EOF Exception encountered - client disconnected during stream processing.", e);

        if (response instanceof HttpServletResponse) {
          ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_BAD_REQUEST);
        }
      } else {
        throw e;
      }
    }
  }

  private boolean isEarlyEofException(final ServletException e) {
    return e.getCause() instanceof ProcessingException
        && e.getCause().getCause() instanceof EofException
        && e.getCause().getCause().getMessage().equals(EARLY_EOF_MSG);
  }

然后您应用过滤器。

  private void addEarlyEofExceptionFilter(final Environment environment) {
    final FilterRegistration.Dynamic filter =
        environment.servlets().addFilter("EarlyEofExceptionFilter", EarlyEofExceptionFilter.class);

    filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
  }

暂无
暂无

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

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