后端工程师获取SseEmitter接收数据
时间: 2025-04-12 08:27:20 浏览: 82
<think>好的,我现在需要帮助用户了解如何使用SseEmitter实现服务器发送事件(SSE)并接收数据的示例。首先,我得回忆一下SSE的基本概念和SseEmitter的作用。SSE允许服务器主动向客户端推送数据,常用于实时更新,比如股票行情或实时通知。而SseEmitter是Spring框架中用于处理SSE的一个类。
接下来,用户需要一个具体的示例,所以我应该分步骤来展示后端的实现和前端的使用。首先,后端部分需要创建一个Controller,使用@GetMapping映射到一个路径,并返回SseEmitter对象。这里需要处理跨域问题,可能需要添加@CrossOrigin注解。然后,在方法内部,创建一个SseEmitter实例,设置超时时间,比如设置为0表示永不超时。
然后,需要在一个单独的线程中发送数据,模拟实时推送。这里可以用ExecutorService来调度任务,每隔一段时间发送数据。发送数据时,使用emitter.send()方法,并处理可能的IOException。完成后调用emitter.complete()。
在前端部分,需要使用EventSource对象连接到后端端点,监听message事件来接收数据,并处理错误和完成事件。这里要注意跨域问题,如果前端和后端不同源,需要正确配置CORS。
另外,需要注意的几个点:确保Spring Boot版本支持SseEmitter,一般是2.0以上;超时设置要根据实际需求调整;在生产环境中可能需要更完善的错误处理和资源管理,比如关闭线程池。
用户可能还会关心如何传递具体的数据格式,比如发送JSON数据,可以在send方法中传递对象,Spring会自动转换为JSON字符串。此外,异常处理部分也很重要,比如客户端断开连接后,后端需要捕获异常并释放资源。
最后,可能需要生成相关问题,比如SSE与WebSocket的区别、如何保证消息顺序、如何处理大规模并发连接等,这有助于用户进一步学习。
现在需要把这些思路整理成结构化的步骤,确保代码示例正确,并且注释清晰。同时,引用用户提供的参考内容,虽然看起来和SSE关系不大,但可能涉及异步支持,所以可以提到AbstractDispatcherServletInitializer的异步配置,确保DispatcherServlet的异步支持已启用,因为SseEmitter依赖于此。</think>以下是通过Spring Boot的SseEmitter实现SSE的详细步骤和示例:
### 一、后端实现
```java
@RestController
@CrossOrigin // 解决跨域问题
public class SseController {
private final ExecutorService executor = Executors.newCachedThreadPool();
@GetMapping("/sse-stream")
public SseEmitter streamData() {
SseEmitter emitter = new SseEmitter(0L); // 设置永不超时
executor.execute(() -> {
try {
for (int i = 1; i <= 10; i++) {
// 构建带时间戳的消息
String jsonPayload = String.format(
"{\"count\": %d, \"timestamp\": \"%s\"}",
i,
LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
);
emitter.send(
SseEmitter.event()
.id(String.valueOf(i))
.name("progress")
.data(jsonPayload)
);
Thread.sleep(1000); // 每秒发送一次
}
emitter.complete();
} catch (IOException | InterruptedException e) {
emitter.completeWithError(e);
}
});
// 客户端断开连接处理
emitter.onCompletion(() -> System.out.println("SSE连接已完成"));
emitter.onTimeout(() -> System.out.println("SSE连接超时"));
emitter.onError((ex) -> System.out.println("SSE发生错误: " + ex.getMessage()));
return emitter;
}
}
```
关键配置说明:
1. 异步支持需在DispatcherServlet中启用,Spring Boot默认开启异步处理[^1]
2. 使用`@CrossOrigin`解决跨域问题
3. 通过`SseEmitter.event()`构建结构化事件
### 二、前端实现
```javascript
const eventSource = new EventSource('http://localhost:8080/sse-stream');
eventSource.addEventListener('progress', (event) => {
const data = JSON.parse(event.data);
console.log(`收到进度更新:
序号: ${event.lastEventId}
计数: ${data.count}
时间: ${data.timestamp}`);
});
eventSource.onerror = (err) => {
console.error('SSE连接异常:', err);
eventSource.close();
};
eventSource.onopen = () => {
console.log('SSE连接已建立');
};
```
### 三、运行效果
```
SSE连接已建立
收到进度更新: 序号:1 计数:1 时间:2023-03-15T14:30:01.123
收到进度更新: 序号:2 计数:2 时间:2023-03-15T14:30:02.456
...
收到进度更新: 序号:10 计数:10 时间:2023-03-15T14:30:10.789
SSE连接已完成
```
### 四、进阶配置建议
1. **安全增强**:添加JWT认证头
```javascript
const eventSource = new EventSource('/sse-stream', {
withCredentials: true
});
```
2. **心跳机制**:防止连接超时
```java
emitter.send(SseEmitter.event().comment("heartbeat"));
```
3. **异常恢复**:实现断线重连
```javascript
function connect() {
const es = new EventSource(...);
es.onerror = () => {
setTimeout(connect, 5000); // 5秒后重连
}
}
```
阅读全文
相关推荐








