假设我的 spring 控制器函数接收大量数据。
鉴于数据结构正确,我想返回 200 OK,并且在那之后我想执行处理,这可能需要一段时间。
据我了解,发送响应的唯一方法是return命令。但我不想在响应发送时结束该功能。
还有其他方法可以在函数中间向客户端发送响应吗?
创建一个新的线程运行是显而易见的,但其他语言(JS)可以让您更优雅地处理它。
@RequestMapping(value = Connectors.CONNECTOR_HEARTBEAT, method = RequestMethod.POST)
public ResponseEntity<String> doSomething(@RequestBody List<Message> messages) {
HttpStatus code = (messages!=null && !messages.isEmpty()) ? HttpStatus.OK
: HttpStatus.NOT_FOUND;
return new ResponseEntity<String>(res, code);
// how do I add code here??
}
当然,您可以在发送响应后进行处理。更通用的方法是使用afterCompletion
的方法HandlerInterceptor
。通过构造,它将在响应发送到客户端后执行,但它迫使您将逻辑分成两个组件:before控制器中的一部分,以及after拦截器中的一部分。
另一种方法是忘记 Spring MVC 机制并在控制器中手动提交响应:
@RequestMapping(value = Connectors.CONNECTOR_HEARTBEAT, method = RequestMethod.POST)
public void doSomething(@RequestBody List<Message> messages, HttpServletResponse response) {
int code = (messages!=null && !messages.isEmpty()) ? HttpServletResponse.SC_OK
: HttpServletResponse.SC_NOT_FOUND;
if (code != HttpServletResponse.SC_OK) {
response.sendError(code, res);
return;
}
java.io.PrintWriter wr = response.getWriter();
response.setStatus(code);
wr.print(res);
wr.flush();
wr.close();
// Now it it time to do the long processing
...
}
请注意 void 返回代码,以通知 Spring 响应已在控制器中提交。
另一个优点是,处理仍然发生在同一个线程中,因此您可以完全访问会话范围的属性或 Spring MVC 或 Spring Security 使用的任何其他线程局部变量...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)