Spring Boot Streaming and SSE异步处理
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@RestController
public class StreamingController {
private final Executor taskExecutor = Executors.newSingleThreadExecutor();
@GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter handleStream() {
SseEmitter emitter = new SseEmitter();
taskExecutor.execute(() -> {
try {
// 异步处理逻辑
// ...
// 发送事件
emitter.send("eventData");
// 当不再发送事件时,调用complete()或cancel()结束流
// emitter.complete();
} catch (IOException e) {
// 发生异常时,可以选择取消发射器
emitter.completeWithError(e);
}
});
return emitter;
}
}
这段代码创建了一个Spring MVC的控制器,提供了一个处理服务器发送事件(SSE)的端点。它使用SseEmitter
来异步发送服务器端事件给客户端。通过定义一个单线程的Executor
,我们确保事件的发送是顺序进行的,避免了潜在的并发问题。异常处理也被加入到了发送事件的逻辑中,确保当发生错误时,可以正确地通知客户端。
评论已关闭