# SSE实现服务端推送 **Repository Path**: logicjwell/nb-base-sse ## Basic Information - **Project Name**: SSE实现服务端推送 - **Description**: SSE实现服务端推送,包含未读消息等 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2024-08-10 - **Last Updated**: 2024-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 在Spring Boot中使用线程池(如ExecutorService)来管理SseEmitter的发送逻辑有几个主要原因: 避免阻塞主线程:在Web应用中,每个请求通常都会在一个单独的线程(或线程池中的线程)中处理。如果直接在处理请求的线程中发送SSE消息,而这个过程可能涉及到等待(例如等待新数据到来),那么就会阻塞该线程,从而可能影响到服务器处理其他请求的能力。通过使用线程池,你可以将耗时的操作(如等待和发送SSE消息)转移到后台线程中,而主线程则可以迅速返回到可用状态,继续处理其他请求。 资源管理:线程池提供了一种有效的方式来管理线程的生命周期和数量。它可以根据需要创建新线程,并在不再需要时重用或销毁线程,从而节省资源。在SSE场景中,由于可能需要长时间保持与客户端的连接,因此管理这些连接的线程变得尤为重要。 并发性:如果你的应用需要同时处理多个SSE连接,那么使用线程池可以更容易地实现并发处理。每个SSE连接都可以在一个单独的线程中处理,而不会相互干扰。 关于emitter.complete();,它确实可以被视为一次从服务端到客户端的“推送”的结束,但更准确地说,它是用来关闭SSE连接的。当你调用emitter.complete();时,你告诉Spring Boot的SSE机制:“我已经完成了所有需要发送给客户端的数据,现在可以安全地关闭这个SSE连接了。”。一旦连接被关闭,客户端就不会再从这个连接中接收到任何数据。 然而,需要注意的是,emitter.complete();并不直接对应于单个消息的发送;它是一个关闭连接的操作。如果你想要发送单个消息给客户端,你应该使用emitter.send(...)方法,并传入你想要发送的数据。你可以多次调用emitter.send(...)来发送多个消息,直到你决定调用emitter.complete();来关闭连接。