【问题标题】:Flush InputStreamResource of spring rest endpoint刷新spring rest端点的InputStreamResource
【发布时间】:2021-10-23 21:14:52
【问题描述】:

我有一个显示流内容的应用程序。这个流是通过 Spring Rest 提供的。流的内容很少从另一个线程推送。

这已经有效,但我唯一遇到的问题是“刷新”流。目前我只在流关闭时才能看到内容,但我想实时显示内容。

我通过 chrome/firefox 调用端点对此进行了测试,并且(完整)内容仅在流关闭后出现(页面不再加载)。同样在我的应用程序中,内容仅在最后显示,而不是同时显示。

@GetMapping("/session")
public ResponseEntity<InputStreamResource> openSession(){
    var inLog = new PipedInputStream();
    var logWritable = new PipedOutputStream(inLog);

    spawnThreadAndPushMessages(logWritable);

    return ResponseEntity.ok()
        .contentType(MediaType.TEXT_PLAIN)
        .body(new InputStreamResource(inLog));
}

我正在像这样写入 PipedOutputStream (logWritable):

spawnThreadAndPushMessages(OutputStream logWritable){
    //thread stuff etc omitted for clarity
    logWritable.write("test".getBytes());
    logWritable.flush();
}

这里出了什么问题?

【问题讨论】:

    标签: java spring stream


    【解决方案1】:

    所以我终于想通了:

    .contentType(MediaType.TEXT_EVENT_STREAM)
    

    我不得不重新考虑我的架构。我现在在另一个线程中写入并发列表。我的端点现在看起来像这样:

    @GetMapping("/session")
    public ResponseEntity<StreamingResponseBody> openSession(){
    var shutdown = new AtomicBoolean(false);
    var tobeFlushed = new ConcurrentLinkedQueue<String>();
    //thread management etc
    createThreadAndWriteToList(tobeFlushed, shutdown);
    
    return ResponseEntity.ok()
        .contentType(MediaType.TEXT_EVENT_STREAM)
        .body(outputStream -> {
          while (!shutdown.get()) {
            tobeFlushed.forEach(x -> {
              try {
                outputStream.write((x+"\n").getBytes(StandardCharsets.UTF_8));
                outputStream.flush();
              } catch (IOException e) {
                e.printStackTrace();
              }
            });
            tobeFlushed.clear();
        }
        System.out.println("Finished request!! ------------------------");
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2020-10-27
      相关资源
      最近更新 更多