我有一项服务,其目标是在计算事件后立即返回一系列事件。 我想流式传输响应,以便客户端可以在计算事件后立即处理它。
这项工作有以下几点:
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之间进行混合响应。