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

问题描述 投票:0回答:1

我收到了一些请求以下例外。它很少发生在喜欢一个星期两次。任何想法可能会导致此或任何建议我应该看看,以便调试这个地方。

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.message.internal.InboundMessageContext.bufferEntity(InboundMessageContext.java:931)在org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:132)在org.glassfish.jersey.server.ContainerFilteringStage 。适用(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 org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:271)在org.glassfish.jersey.internal.Errors $ 1.call(Errors.java:267) .process(Errors.java:315)在org.glassfish.jersey.internal.Errors.process(Errors.java:297)在org.glassfish.jersey.internal.Errors.process(Errors.java:267)在有机glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)在org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)在org.glassfish.jersey.server.ApplicationHandler.handle(应用A nHandler.java:1154)在org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)在org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)在org.glassfish.jersey .servlet.ServletContainer.service(ServletContainer.java:388)在org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)在org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473 )在org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)在org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)在org.eclipse.jetty。 server.handler.ScopedHandler.handle(ScopedHandler.java:141)在org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)在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 ropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:68)在org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169)在org.eclipse.jetty.server.handler.HandlerWrapper.handle( HandlerWrapper.java:132)在org.eclipse.jetty.server.Server.handle(Server.java:564)在org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)在org.eclipse.jetty .server.HttpChannelOverHttp.earlyEOF(HttpChannelOverHttp.java:239)在org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1444)在org.eclipse.jetty.server.HttpConnection.parseRequestBuffer(HttpConnection.java:351 )在org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:234)在org.eclipse.jetty.io.AbstractConnection $ ReadCallback.succeeded(AbstractConnection.java:279)在org.eclipse.jetty.io。 FillInterest.fillable(FillInterest.java:110)在org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:289)在org.eclipse.jetty.io.ssl.SslConnection $ 3.succeeded(SslConnection.java : 149)在org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)维持在org.eclipse.jetty.util org.eclipse.jetty.io.ChannelEndPoint $ 2.run(ChannelEndPoint.java:124)。 thread.Invocable.invokePreferred(Invocable.java:128)在org.eclipse.jetty.util.thread.Invocable $ InvocableExecutor.invoke(Invocable.java:222)在org.eclipse.jetty.util.thread.strategy.EatWhatYouKill。 doProduce(EatWhatYouKill.java:294)在org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)在org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java: org.eclipse.jetty.io:673)在org.eclipse.jetty.util.thread.QueuedThreadPool $ 2.run(QueuedThreadPool.java:591)在java.lang.Thread.run(Thread.java:748)所致。 EOFException类:在org.eclipse.jetty.server.HttpInput $ 3.getError(HttpInput.java:1104)在org.eclipse.jetty.server.HttpInput $ 3.noContent(HttpInput.java:1093)在org.eclipse.jetty早期EOF .server.HttpInput.read(HttpInput.java:307)在java.io.InputStream.read(InputStream.j AVA:101)在org.glassfish.jersey.message.internal.ReaderWriter.writeTo(ReaderWriter.java:115)在org.glassfish.jersey.message.internal.InboundMessageContext.bufferEntity(InboundMessageContext.java:918)... 68公共帧省略

java rest jersey dropwizard
1个回答
0
投票

这个问题仍然存在1.3.8,是一个open issue

好。似乎有一种变通方法。您可以创建一个过滤器类过滤器提前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, "/*");
  }
© www.soinside.com 2019 - 2024. All rights reserved.