我有一个请求映射,如下所示:
private final static byte[] byteArray = ...;
@RequestMapping(value=Array("/foobar"))
void sendByteArray(@RequestBody Request request, OutputStream os) {
os.write(byteArray);
os.flush();
doLengthyCleanup();
}
我发现请求客户端在服务完成doLengthyCleanup()
之后才真正收到响应正文。
由于清理不会影响响应本身,因此我希望通过在发送响应后执行清理来缩短响应时间。我怎么能这样做?
答案 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中。