springboot实现长轮询
时间: 2024-12-24 22:40:17 浏览: 16
Spring Boot 实现长轮询 (Long Polling) 主要是利用 HTTP 协议的特性来实现实时数据推送,通常用于 WebSockets 没有支持的情况下。长轮询的工作原理是客户端向服务器发送一个 HTTP 请求,然后服务器并不立即返回响应,而是保持连接打开,直到有新数据可用或者超时才会发送数据并关闭连接。这样就形成了一个“假死”的请求,直到服务器有更新才唤醒。
以下是简单的步骤:
1. 客户端(JavaScript):
- 使用 JavaScript 的 `XMLHttpRequest` 或者 Fetch API 发起一个异步 GET 请求到 Spring Boot 后端的某个 URL。
- 避免设置自动断开连接,让请求保持打开状态。
```javascript
fetch('/poll', {
method: 'GET',
keepAlive: true,
headers: { 'Content-Type': 'application/json' }
}).then(response => response.text());
```
2. 后端(Spring Boot):
- 创建一个处理这个 GET 请求的 Controller,当有实时数据更新时,可以选择手动中断当前连接或者设置一个较短的超时时间(如 5 秒),然后将数据发送回客户端,并关闭连接。
- 如果无新数据,可以设置一个较长的超时时间(例如 60 秒)让连接保持活跃,直到有更新。
```java
@GetMapping("/poll")
public String poll(@RequestParam("lastUpdate") Long lastUpdate, HttpServletResponse response) throws IOException {
// 检查是否有新数据...
if (newDataAvailable) {
// 更新数据并关闭连接
response.getWriter().print(jsonify(data));
response.flushBuffer();
response.close();
} else {
// 设置超时并保持连接
response.setDateHeader("Connection", 60 * 1000);
response.setDateHeader("Keep-Alive", 60 * 1000);
Thread.sleep(5000); // 仅作为示例,实际应用应使用定时任务
}
}
```
阅读全文