Spring3MVC,异步流响应
我希望使用异步解决方案从Spring MVC控制器方法中使用Spring3MVC,异步流响应,spring,spring-mvc,asynchronous,outputstream,spring-3,Spring,Spring Mvc,Asynchronous,Outputstream,Spring 3,我希望使用异步解决方案从Spring MVC控制器方法中使用OutputStream或Writer来流式输出我的内容,即不阻止用于http请求的基本线程池。就我所能找到的而言,一般来说,异步使用DefferedResult。当您返回一个视图字符串名称时,这是很好的,但想不出它与流一起工作的方式。找不到任何有用的东西 谢谢如上所述,您可以在另一个线程中执行计算,从而卸载http线程池。 您可以尝试组合DefferedResult和byte[](DefferedResult)返回类型(以前通过tea
OutputStream
或Writer
来流式输出我的内容,即不阻止用于http请求的基本线程池。就我所能找到的而言,一般来说,异步使用DefferedResult
。当您返回一个视图字符串名称时,这是很好的,但想不出它与流一起工作的方式。找不到任何有用的东西
谢谢如上所述,您可以在另一个线程中执行计算,从而卸载http线程池。
您可以尝试组合DefferedResult
和byte[]
(DefferedResult)返回类型(以前通过tearrayhttpMessageConverter注册)。因此,最终的方法如下所示:
@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;
}
@ResponseBody
公共差异结果foo(HttpServlet响应){
//使用响应设置标题
response.setContentType(“someContentType”);
...
DefferedResult r=新的DefferedResult();
executionService.submit(()->{
r、 setResult(getBytes());
});
返回r;
}
另一种选择是将不同的结果和响应结合起来。不要忘记在servlet 3.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();
}
}
}
};
}
}
@控制器
公共类测试控制器{
@请求映射(“/”)
公共流线进入车身把手要求(){
返回新的StreamingResponseBody(){
@凌驾
public void writeTo(OutputStream out)引发IOException{
对于(int i=0;i<1000;i++){
out.write((Integer.toString(i)+“-”)
.getBytes());
out.flush();
试一试{
睡眠(5);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
};
}
}
您可以尝试使用WebSocket方法;cliet正在侦听任何事件,您只需在异步模式下完成对内容的流式传输,然后就可以传递给client。我想,只要您设置了结果,Spring就会结束通信,而不会继续以流的形式输出字节。不