【问题标题】:return response from SpringBoot method in several pieces从 SpringBoot 方法分几部分返回响应
【发布时间】:2018-03-23 15:52:22
【问题描述】:

现在我有一个在 SpringBoot 中可以正常工作的方法。它接收一个 POST 参数,对其进行一些处理,并返回一个字符串结果(不使用模板)。

顺便说一句,我不确定我是否正确设置了方法签名,但正如我所说的那样:

@RequestMapping(value = "/", method = RequestMethod.POST)
@SuppressWarnings("unchecked")
@ResponseBody
String processFile(@RequestParam("myinput") MultipartFile file, HttpServletResponse response) throws IOException {

    // do some processing
    String myresponse = 'yadayada';
    return myresponse;
}

我将开始处理更大的文件,因此我想将字符串 myresponse 分成几部分返回。所以对于字符串part1 part2 part3,我可能会立即将part1返回给客户端,然后在10秒后返回part2,然后在15秒后返回part3

但是,如果不进行一些更改,这将无法正常工作,因为现在只有一个单一的整体 return 语句。您认为最好的方法是什么?我看过一些关于“返回流”的问答,但对 Java 和 Spring Boot 不熟悉我不确定“返回流对象”和“让实际响应流式传输,即分多个部分”之间是否有区别

【问题讨论】:

  • 我会使用 websocket,上传文件时在您的客户端打开它,并在您决定时从控制器向套接字发送通知。还将插座与弹簧靴集成在一起,非常快速和容易
  • 我不确定 websocket 能带给我什么。我本身并不需要通知,我只需要“流式传输”的响应
  • 我阅读了一个使用 Java 8 Streams (stackoverflow.com/questions/37155557/…) 的解决方案,但不幸的是我需要为这个项目使用 Java 7。
  • 我将支持使用WebSockets 的意见。这似乎是您尝试做的完美解决方案。

标签: java spring spring-mvc spring-boot


【解决方案1】:

答案其实很简单。只需在响应上直接获取 PrintWriter,并在数据可用时使用它来写入和刷新数据。我认为这不会让我利用模板,但除此之外它可以工作。

@RequestMapping(value = "/", method = RequestMethod.POST)
@SuppressWarnings("unchecked")
@ResponseBody
String processFile(@RequestParam("myinput") MultipartFile file, HttpServletResponse response) throws IOException {
    PrintWriter printWriter =  response.getWriter();
    printWriter.println("a");
    printWriter.flush();
    TimeUnit.SECONDS.sleep(20);
    printWriter.println("b");
    printWriter.flush();
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
相关资源
最近更新 更多