【问题标题】:Spring 3 MVC, stream response asynchronouslySpring 3 MVC,异步流响应
【发布时间】:2014-06-29 01:56:42
【问题描述】:

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

谢谢

【问题讨论】:

  • 你可以尝试使用 WebSocket 方法;客户端正在监听任何事件,您只需完成以异步模式流式传输内容,然后您就可以传递给客户端

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


【解决方案1】:

您正在寻找的可能是以下内容。不确定它是否会阻塞 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();
                    }
                }
            }
        };
    }
}

【讨论】:

    【解决方案2】:

    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;
    }
    

    另一种选择是结合 Deferedresult 和 ResponseEntity。不要忘记在 servlet 3.0+ 容器中使用它

    【讨论】:

    • 我猜 Spring 会在你 setResult 后立即结束通信,并且不会继续将字节输出为流。没有?
    猜你喜欢
    • 2015-11-13
    • 2014-07-22
    • 2017-12-05
    • 2014-12-20
    • 2013-05-26
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多