【问题标题】:How to notify exception to client after HTTP code is returnedHTTP代码返回后如何通知客户端异常
【发布时间】:2019-01-21 18:25:58
【问题描述】:

我使用 Java 和 Spring 框架在 REST 控制器类中创建绑定到 GET 请求的方法。

但是,此方法返回的结果作为流发送,由另一个服务异步馈送(使用 InfluxDB)。

因此,它立即向客户端返回代码 200,即使之后可能发生超时或任何异常。

我想将此通知客户。

/**
 * InfluxDB service
 */
@Inject
InfluxDBService influxDBService;

/**
 * @return CSV file containing the data
 */
@RequestMapping(value="/dump", method=RequestMethod.GET, produces="application/csv")
public @ResponseBody void getDump(
        HttpServletResponse response,
        @RequestParam(value = "app", required = false) String appFilter,
        @RequestParam(value = "context", required = false) String contextFilter,
        @RequestParam(value = "path", required = false) String pathRegex
        ) throws DataAnalysisException {

    [...]

    InputStream dump = influxDBService.dump( ... filters after treatment ...);

    response.setContentType("application/csv");

    long currentTime = System.currentTimeMillis() / 1000;
    String fileName = "influxdb-dump_" + currentTime + ".csv";

    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    try {
        FileCopyUtils.copy(dump, response.getOutputStream());
    } catch (IOException e) {
        throw new DataAnalysisException("Could not get output from request results", e);
    }
}

在 dump() 方法中,OkHttpClient 创建到 InfluxDB 服务器的远程连接并返回数据的 InputStream。此客户端的默认超时时间为 10 秒。

如果没有太多数据,一切正常,客户端下载包含正确数据的 CSV。

但如果 InfluxDB 服务器没有及时响应(数据过多),然后会下载一个空的 CSV 文件,即使返回 HTTP 代码 200。

问题是,当我调试时,它会通过返回 200 的 FileCopyUtils.copy 行,但 10 秒后它会通过“抛出新的 DataAnalysisException”捕获块。但是此时客户端已经下载了一个空的CSV并得到了代码200。

DataAnalysisException 是返回 HTTP 代码 500 的自定义异常。

我的问题是:超时后,有没有办法通知客户我们实际上遇到了问题,即使他得到了 200? 这可以帮助我建立一个错误页面来通知他。

谢谢大家。

【问题讨论】:

    标签: java spring rest http influxdb


    【解决方案1】:

    我解决了。

    我使用了StreamUtils.copy,而不是FileCopyUtils.copy,它基本上是一样的,只是它不会自动关闭输入和输出流。

    然后,在一个 catch 子句中,我执行 response.reset() 然后 response.sendError(code, "msg"),然后抛出一个异常。

    在 finally 子句中,我手动关闭输入和输出流。

    因此,CSV 标头和剩余数据被清除,当流关闭时,它不会告诉浏览器下载 CSV 文件。

    如果您需要更多信息或精确代码,请随时与我联系。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2014-11-13
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多