使用akka-http登录响应正文时出现错误“放气机已关闭”

时间:2019-01-18 15:54:52

标签: scala akka-http

我正在使用Akka-Http来创建备用服务器,并且我想记录请求和结果,但是,每当我尝试对响应实体执行runReduce时,我都会遇到异常。异常为java.lang.NullPointerException: Deflater has been closed。异常不会阻止我记录身体,但是我只会在日志中��]D�O!�c�?�%{�GY\��>������t出现乱码。有人可以解释为什么会这样吗?我怀疑是因为存储响应主体的流是关闭还是未打开,但是我不知道如何解决。

用于记录的设置如下所示。记录发生在logResponse内部的RequestResponseLogWriter方法中。我使用akkas自己的指令来获取请求和响应实体。记录是使用slf4j完成的。

trait RouteBuilder extends Directives {

  val logWriter = new RequestResponseLogWriter()

  val routes: Route =
    extractRequestContext { context =>
      logRequestResult(LoggingMagnet(_ => logWriter.responseLogging(context))) {
        ComponentRegistry.searchRestApi.routes
      }
    }
}


class RequestResponseLogWriter extends LazyLogging {
  val responseLogging = (context: RequestContext) => (request: HttpRequest) =>
                        (result: RouteResult) =>
    result match {
      case RouteResult.Complete(response) => logResponse(context, request, response)
      case RouteResult.Rejected(_) =>
    }

  private def logResponse(context: RequestContext, request: HttpRequest, 
                          response: HttpResponse): Unit = {
    implicit val ec: ExecutionContext = context.executionContext
    implicit val mat: Materializer = context.materializer
    response.entity.dataBytes.runReduce(_ ++ _)
      .foreach(bytes => logger.info(s"Body ${bytes.utf8String}"))
  }
}

0 个答案:

没有答案