首页 > 解决方案 > PDF 部分下载,状态为 200 并在 ZUUL 网关中显示 SocketException: Connection reset

问题描述

我们正在尝试从 Spring Boot 微服务应用程序下载多个 PDF 并在浏览器中显示 PDF 的内容。流程是,客户端点击 zuul 网关和网关调用 Spring Boot 应用程序。负责提供 PDF 的 Spring Boot 应用程序。

案例 1:当十个大小分别为 150KB、500KB、10MB、10MB、10MB、40MB、40MB、40MB、5MB、5MB 的 PDF 时,很少有 PDF 被完全下载,其中三个 40MB 的文件被部分下载到 19MB(有时大小不同)状态码为 200。

案例 2:完全下载相同的 40MB 文件。

下载部分 PDF 时,zuul 网关中的日志会给出 SocketException: Connection reuse。

已经尝试过:

  1. 在 Gateway 中将服务器超时增加到 30 分钟,Spring 启动应用程序和浏览器端仍然没有运气。在 5 分钟内下载所有 PDF 以及部分 PDF

  2. 试图添加一个额外的 zuul 错误过滤器,它负责发送 401/500 以防发生 SocketException 但客户端仍然显示 200 状态以防部分下载的 PDF

公共类 CustomErrorFilter 扩展 ZuulFilter{

private static final Logger LOG = LoggerFactory.getLogger(CustomErrorFilter.class);
protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";

@Override
public boolean shouldFilter() {
    // return RequestContext.getCurrentContext().getThrowable() != null;
    return true;
}

@Override
public Object run() {

    /*try {*/

        RequestContext ctx = RequestContext.getCurrentContext();

        Throwable throwable = ctx.getThrowable();

        if (throwable != null) {

             //ctx.setResponseBody("Zuul exception:" + throwable.getMessage() + " cause: " +
            // throwable.getCause()); // just for development purposes
            // ctx.getResponse().setContentType("application/json");
             //ctx.setResponseStatusCode(401);
             //ctx.setSendZuulResponse(false);
             //ctx.setResponseBody("401");
             //ctx.set(SEND_ERROR_FILTER_RAN);

            //throw new RuntimeException("there is a problem in downloading file");
             //return null;
            ZuulException zuulException = new ZuulException("User message", 500, "Error Details message");
            throw new ZuulRuntimeException(zuulException);
        }
    /* } */
        /*catch (Exception ex) {
            LOG.error("Exception filtering in custom error filter", ex);
            throw ex;
        }*/

        return null;
}

@Override
public String filterType() {
    return ERROR_TYPE;
}

@Override
public int filterOrder() {
    return SEND_ERROR_FILTER_ORDER+Integer.MAX_VALUE;
}

}

请说明为什么这个过滤器没有运行。

对于部分 PDF 下载,我们需要不同的状态码,除了 200。

标签: javaspring-bootsocketshttpnetflix-zuul

解决方案


推荐阅读