流媒体中的spring boot控制响应结束

时间:2018-02-12 15:09:48

标签: java multithreading spring-boot

我有一项服务,其目标是在计算事件后立即返回一系列事件。 我想流式传输响应,以便客户端可以在计算事件后立即处理它。

这项工作有以下几点:

return new ResponseEntity<>(new StreamingResponseBody()
{
  @Override
  public void writeTo(OutputStream out)
  {
    Subscriber subscriber = new EventSubscriber(duration);
    updateService.getEventStream(subscriber);

    while (!subscriber.isComplete()) {
      try { 
        Thread.sleep(100);
      }
      catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    } 
  }

}, HttpStatus.OK);
}

我订阅了一些事件流,每当计算事件时,事件都会写入输出流:

public class EventSubscriber implements Subscriber<Map<String, String>>
{
...
   @Override
  public void onNext(String event)
  {
    try {
      out.write((event+ "\n").getBytes());
      out.flush();
    }
    catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
...
}

我对这个解决方案的问题是&#39; Thread.sleep(100)&#39;我想删除。

但是当我删除它时,当响应实体被发送到客户端时,输出流被关闭。

如果不坚持线程我怎么能保持打开?

例如,我希望输出流保持打开状态,直到调用EventSubscriber的oncomplete方法为止。

提前感谢您的帮助。

PS:DeferedResult不像DeferedResult那样帮助我,只有在计算完所有内容后才会将响应发送给客户端。从某种意义上说,我想在DeferedResult和StreamingResponseBody的ResponseEntity之间进行混合响应。

0 个答案:

没有答案