我想使用异步解决方案从Spring MVC控制器方法使用OutputStream
或Writer
流式传输我的内容,即不阻止用于http请求的基本线程池。据我所知,通常使用DefferedResult<?>
进行异步。返回视图字符串名称时没关系,但无法想到它可以用于流的方式。找不到任何有用的东西。
由于
答案 0 :(得分:0)
如上所述here,您可以在另一个线程中执行计算,从而释放http线程池。
您可以尝试组合DefferedResult
和byte[]
(DefferedResult)返回类型(之前注册ByteArrayHttpMessageConverter
)。所以最终的方法看起来像这样:
@ResponseBody
public DefferedResult<byte[]> foo(HttpServlet response) {
//set headers using response
response.setContentType("someContentType");
...
DefferedResult<byte[]> r = new DefferedResult<>();
executionService.submit(() -> {
r.setResult(getBytes());
});
return r;
}
另一个选择是组合Defferedresult和ResponseEntity。不要忘记在servlet 3.0+容器中使用它
答案 1 :(得分:0)
可能您正在寻找以下内容。不确定是否会阻止http线程池。
@Controller
public class TestController {
@RequestMapping("/")
public StreamingResponseBody handleRequest () {
return new StreamingResponseBody() {
@Override
public void writeTo (OutputStream out) throws IOException {
for (int i = 0; i < 1000; i++) {
out.write((Integer.toString(i) + " - ")
.getBytes());
out.flush();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
}
}