Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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
如何从JavaSpringMVC3.0WebApp流式传输文本响应_Java_Servlets_Spring Mvc - Fatal编程技术网

如何从JavaSpringMVC3.0WebApp流式传输文本响应

如何从JavaSpringMVC3.0WebApp流式传输文本响应,java,servlets,spring-mvc,Java,Servlets,Spring Mvc,如何将文本流式输出到浏览器上的页面,以显示可能需要15-20秒的操作进度?我已经尝试直接写入HttpServletResponse的输出流,但是在整个过程完成后,用户仍然可以看到完整的输出 这就是我到目前为止所尝试的 @RequestMapping(value = "/test") public void test(HttpServletResponse response) throws IOException, InterruptedException {

如何将文本流式输出到浏览器上的页面,以显示可能需要15-20秒的操作进度?我已经尝试直接写入
HttpServletResponse
的输出流,但是在整个过程完成后,用户仍然可以看到完整的输出

这就是我到目前为止所尝试的

 @RequestMapping(value = "/test")
 public void test(HttpServletResponse response)
            throws IOException, InterruptedException {
    response.getOutputStream().println("Hello");
    response.getOutputStream().flush();
    Thread.sleep(2000);
    response.getOutputStream().println("How");
    response.getOutputStream().flush();
    Thread.sleep(2000);
    response.getOutputStream().println("are");
    response.getOutputStream().flush();
    Thread.sleep(2000);
    response.getOutputStream().println("you");
    response.getOutputStream().flush();
}

如果您使用的是spring控制器,您可以通过响应主体注释来完成上述操作。

我不是spring MVC专家,但我认为您应该发送一个202响应代码“accepted”,这表示服务器已收到请求,并将进行一些异步处理。通常,服务器提供一个URL,允许客户端发出有关操作状态的请求。您试图执行的操作违反了服务器/客户端关系的正常工作方式。客户端调用服务器,服务器响应,然后连接关闭。你是在什么背景下尝试这样做的,原因是什么?也许我可以提供一些更深入的见解或想出另一种方法来做这件事?

尝试使用:

response.flushBuffer();
正如JavaDoc所说:

强制将缓冲区中的任何内容写入客户端。对该方法的调用会自动提交响应,这意味着将写入状态代码和标题


在使用Chrome进行测试时,这对我很有效

response.setBufferSize(0);
response.setContentType("text/event-stream");

... write content ...

你有没有尝试过在每次发送数据之后刷新输出流?@Luciano我已经在问题中添加了我到目前为止所做的尝试。当我从Chrome查看页面时,这不起作用。我认为您最好的选择是另一种方法:在javascript中使用计时器,每1秒(或半秒)从/test获取数据,使用ajax,并且/test将返回在调用之前未发送的任何内容。@Luciano您建议的是我的备用计划,不管怎样,我最终可能会使用它。然而,如果我的问题有一个有效的答案,我可以看到这在没有异步作业执行器和状态管理的情况下完成,我觉得这会更优雅。你也可以尝试使用Web套接字,但这需要对你的应用程序进行更多的更改。@SeanPatrickFloyd哦,对了,我没有看到/读到这一点。这有点难。。。不确定,谢谢你的关注!基本上,我想让用户能够请求作业执行,能够监控进度,并在作业完成后更新其视图。我可以通过使作业执行器异步并在
会话中维护一些状态
和从UI轮询来了解如何做到这一点。但是,如果我的问题有一个有效的答案,我可以看到这是在没有异步执行器和状态管理的情况下完成的。我觉得您要求的是服务器与客户机联系,虽然不是不可能,但这将是非常不规则的。显然,有一些路由可以将信息以分块的形式发送回客户端(比如FTP),但不幸的是,我知道这是否适用于您想要做的事情,也不知道Spring MVC是否可以。祝你好运谢谢我可能会使用你和其他人提到的投票方法,暂时保留这个问题。我只是喜欢探索所有的可能性。干杯
response.setBufferSize(0);
response.setContentType("text/event-stream");

... write content ...