【发布时间】:2016-09-29 19:42:39
【问题描述】:
我有一个如下所示的请求映射:
private final static byte[] byteArray = ...;
@RequestMapping(value=Array("/foobar"))
void sendByteArray(@RequestBody Request request, OutputStream os) {
os.write(byteArray);
os.flush();
doLengthyCleanup();
}
我发现请求客户端直到服务完成 doLengthyCleanup() 之后才真正收到响应正文。
由于清理不会影响响应本身,我想通过在发送响应后执行清理来缩短响应时间。我该怎么做?
【问题讨论】:
-
一种解决方案是异步执行清理。
-
我期望 Spring 实际上会通过输出流同步传递字节,从而使任何类型的线程都变得不必要,并使事情变得更简单。似乎在 Spring 中应该有一个一流的支持方法来执行此操作,它比创建一个全新的线程或绑定到
HandlerInterceptorAdapter更简单。 -
字节数组是类成员吗?有状态的控制器不是线程安全的。
-
@doge
byteArray只是为了说明。实际上,控制器根据请求本身生成响应值,但我认为这与手头的问题无关。为简单起见,您可以将byteArray视为静态内容。 -
打电话给
response.flush()怎么样? Spring 会以某种方式知道没有更多内容要写入流,或者您应该明确地flush它。