立即发送Spring响应流,而不是等到方法返回

时间:2016-05-31 17:04:42

标签: java spring

我有一个请求映射,如下所示:

private final static byte[] byteArray = ...;

@RequestMapping(value=Array("/foobar"))
void sendByteArray(@RequestBody Request request, OutputStream os) {
  os.write(byteArray);
  os.flush();
  doLengthyCleanup();
}

我发现请求客户端在服务完成doLengthyCleanup()之后才真正收到响应正文。

由于清理不会影响响应本身,因此我希望通过在发送响应后执行清理来缩短响应时间。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

this answer所示,您需要通过直接接受响应并自行设置状态代码向Spring表明您正在处理响应:

void sendByteArray(@RequestBody Request request, HttpServletResponse response) {
  response.setStatus(HttpStatus.SC_OK);
  OutputStream os = response.getOutputStream();
  os.write(byteArray);
  os.flush();
  os.close();
  doLengthyCleanup();
}

答案 1 :(得分:2)

@RequestMapping(value=Array("/foobar"))
void sendByteArray(@RequestBody Request request, OutputStream os) {
  os.write(byteArray);
  os.flush(); // not sure
  doLengthyCleanup(); 
}

@Async
void doLengthyCleanup() {
  // this will be executed asynchronously
}

更新:取自this question

如果从同一个类中的另一个方法调用@Async方法,除非为@EnableAsync启用AspectJ代理模式(并提供当然的编织器),这样做不会起作用(google"代理自我调用")。最简单的解决方法是将@Async方法放在另一个@Bean中。