我想知道为什么在大多数教程中
SseEmitter
事件在执行器内部发送。
SseEmitter emitter = new SseEmitter();
ExecutorService sseMvcExecutor = Executors.newSingleThreadExecutor();
sseMvcExecutor.execute(() -> { ...
如果他们在没有它的情况下运行会发生什么?
当您在执行器内发送事件时,事件处理发生在单独的线程中。
如果没有 Executor,事件仍然是异步发送的,因为当您调用
SseEmitter
时,send()
本身不会阻塞主线程。但是,如果您的事件需要处理时间或来自外部源(例如,消息队列或数据库获取),则直接在主线程中处理所有内容将使该线程等待,特别是对于缓慢或 I/O 密集型任务。
例如-
SseEmitter emitter = new SseEmitter();
try {
emitter.send("Hello, World!");
// Some processing logic --> This will block your main thread !
emitter.send("More data!");
} catch (Exception e) {
emitter.completeWithError(e);
}
return emitter;
使用执行器为事件生成提供更大的灵活性和隔离性。