Spring 3 MVC,流异步响应

时间:2014-05-11 18:50:39

标签: spring spring-mvc asynchronous outputstream spring-3

我想使用异步解决方案从Spring MVC控制器方法使用OutputStreamWriter流式传输我的内容,即不阻止用于http请求的基本线程池。据我所知,通常使用DefferedResult<?>进行异步。返回视图字符串名称时没关系,但无法想到它可以用于流的方式。找不到任何有用的东西。

由于

2 个答案:

答案 0 :(得分:0)

如上所述here,您可以在另一个线程中执行计算,从而释放http线程池。 您可以尝试组合DefferedResultbyte[](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();
                    }
                }
            }
        };
    }
}