繁体   English   中英

刷新弹簧休息端点的 InputStreamResource

[英]Flush InputStreamResource of spring rest endpoint

我有一个显示流内容的应用程序。 这个流是通过 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();
}

这里出了什么问题?

所以我终于想通了:

.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!! ------------------------");
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM