Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring3MVC,异步流响应_Spring_Spring Mvc_Asynchronous_Outputstream_Spring 3 - Fatal编程技术网

Spring3MVC,异步流响应

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

我希望使用异步解决方案从Spring MVC控制器方法中使用
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就会结束通信,而不会继续以流的形式输出字节。不