【发布时间】: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