java - 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。
已经尝试过:
在 Gateway 中将服务器超时增加到 30 分钟,Spring 启动应用程序和浏览器端仍然没有运气。在 5 分钟内下载所有 PDF 以及部分 PDF
试图添加一个额外的 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。
解决方案
推荐阅读
- python - 如何基于相似度矩阵对大量字符串进行聚类?
- c# - 参数化 ResourceDictionary - 这可能吗?
- c++ - 指向非常量数据的 const 指针
- flurl - 如何使用 flurl 获取带有查询字符串参数的响应正文
- python - 根据条件和其他列在熊猫数据框中删除重复行(汇总数据)
- redhat - Java多个进程写入同一文件夹性能问题
- python - 如何暂停读取串行数据以便调用函数?
- bazel - 如何查询 bazel 以获取扩展名为 .srcjar.zip 的生成文件的完整列表?
- flutter - 设置 Flutter RaisedButton 样式的正确方法是什么?
- typescript - 根据对象中已设置的属性缩小联合类型