【问题标题】:Stream a response in Spring mvc在 Spring mvc 中流式传输响应
【发布时间】:2016-02-28 09:23:17
【问题描述】:

情况就是这样,假设我有一个端点并接收一个请求,该请求在一段时间或其他时间范围内检索数据,该请求的结果是我从数据库中获得的一个大列表,比如说一个列表一个“人”对象,然后对于每个人对象,我必须调用另一个方法,它可能有点慢,如果我必须等到它对这个的所有元素执行,它会延迟很多响应大名单。

我想要完成的是我可以通过一个休息端点流式传输响应,而我的前端不必等到所有这个列表都被处理后才能开始在屏幕上显示它。

所以我在这里有一个困惑,我知道使用spring @Async 的异步方法即使任务仍未完成,它也会使消费者能够给出响应,但据我了解,这是在发送电子邮件或您不会在屏幕上显示其回复的任何其他任务或一系列任务的情况下很有帮助。

但是对于要在屏幕上显示的响应,我想我应该在准备好整个“人”对象后立即流式传输大量数据。

实现此目的的正确方法是什么?在这种情况下,Async 方法是否有帮助,或者我应该只找到一种方法来检测我何时形成了一个人对象来流式传输它?或者我大错特错了,我不理解异步和流的概念。

一个小例子会有所帮助。

谢谢。

【问题讨论】:

    标签: rest spring-mvc asynchronous stream streaming


    【解决方案1】:

    从过去 3 天开始,我一直在尝试理解相同的概念,这是我的理解,可能会对您有所帮助。

    异步 REST 端点:

    如果您的 REST 端点正在执行一些复杂的业务逻辑或调用一些外部服务并且可能需要一些时间来响应,那么最好尽快从 API 响应,将耗时的逻辑转移到后台(单独的线程)。这就是异步处理将提供帮助的地方。

    分块输出:

    如果您的端点预计会发送大量数据。如果我决定在输出可用时立即开始渲染输出(在 UI 中),为了改善用户体验,来自 REST 端点的分块输出是更好的方法。

    使用 jersey,我们可以实现异步处理和分块输出,如下面的示例所述。

    public ChunkedOutput<String> getChunkedResponse() {
            final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);
    
            new Thread() {
                public void run() {
                    try {
                        String chunk;
                        int index = 0;
    
                        while ((chunk = getWordAtIndex(index)) != null) {
                            output.write(chunk);
                            index++;
                        }
                    } catch (IOException e) {
                        //Add code to handle the IO Exception during this operation
                    } finally {
                        try {
                            output.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
    
            return output; // This output object may be returned way before output is created
        }
    

    我已经尝试了一个样本来测试这与球衣和弹簧靴的组合。您可以在我的 git 存储库here 中查看它。

    希望对你有帮助。

    【讨论】:

    • 嘿,谢谢你的例子!我会做更多关于分块响应的阅读。
    猜你喜欢
    • 2012-07-06
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多