SSE 连接每 5 分钟失败一次
SSE connection keeps failing every 5 minutes
我正在使用 SseEmitter
Spring API 公开一个简单的 SSE 端点,将所有发射器保持在 ConcurrentHashMap
中。每个发射器的超时设置为 24 小时。每隔 10 秒,我就会向所有客户发送一条消息。客户端订阅本机 EventSource
实现,监听特定名称的事件。
不幸的是,我注意到连接每 5 分钟就会断开并重新建立 - 即使发射器的超时已明确设置为 24 小时。客户端确实将其记录为错误,但在服务器端却什么也没有。 Tomcat 和 Jetty 都会出现此问题。我想保持会话打开而不受任何干扰,因此每 5 分钟重置一次连接是不可接受的。知道为什么会发生这种情况吗?
@RestController
@RequestMapping("api/v1/sse")
class SseController {
private val emitters = ConcurrentHashMap<String, SseEmitter>()
@GetMapping
fun initConnection(@RequestParam token: String): SseEmitter {
logger.info { "Init connection from $token" }
val emitter = SseEmitter(24 * 60 * 60 * 1000)
emitter.onCompletion {
logger.info { "Completion" }
emitters.remove(token)
}
emitter.onTimeout { logger.info { "Timeout " } }
emitter.onError { logger.error(it) { "Error" } }
emitters[token] = emitter
return emitter
}
@Scheduled(fixedRate = 10000)
fun send() {
emitters.forEach { (k, v) ->
logger.info { "Sending message to $k" }
v.send(
SseEmitter.event()
.id(UUID.randomUUID().toString())
.name("randomEvent")
.data("some data")
)
}
}
}
const eventSource = new EventSource(url);
eventSource.addEventListener('randomEvent', (e) =>
console.log(e.data)
);
eventSource.onerror = (e) => console.log(e);
好的,这似乎是 Stackblitz 的服务工作者的问题。我刚刚在 Chrome 的普通控制台中实施了相同的 client-side 解决方案,并且不再发生断开连接。
我正在使用 SseEmitter
Spring API 公开一个简单的 SSE 端点,将所有发射器保持在 ConcurrentHashMap
中。每个发射器的超时设置为 24 小时。每隔 10 秒,我就会向所有客户发送一条消息。客户端订阅本机 EventSource
实现,监听特定名称的事件。
不幸的是,我注意到连接每 5 分钟就会断开并重新建立 - 即使发射器的超时已明确设置为 24 小时。客户端确实将其记录为错误,但在服务器端却什么也没有。 Tomcat 和 Jetty 都会出现此问题。我想保持会话打开而不受任何干扰,因此每 5 分钟重置一次连接是不可接受的。知道为什么会发生这种情况吗?
@RestController
@RequestMapping("api/v1/sse")
class SseController {
private val emitters = ConcurrentHashMap<String, SseEmitter>()
@GetMapping
fun initConnection(@RequestParam token: String): SseEmitter {
logger.info { "Init connection from $token" }
val emitter = SseEmitter(24 * 60 * 60 * 1000)
emitter.onCompletion {
logger.info { "Completion" }
emitters.remove(token)
}
emitter.onTimeout { logger.info { "Timeout " } }
emitter.onError { logger.error(it) { "Error" } }
emitters[token] = emitter
return emitter
}
@Scheduled(fixedRate = 10000)
fun send() {
emitters.forEach { (k, v) ->
logger.info { "Sending message to $k" }
v.send(
SseEmitter.event()
.id(UUID.randomUUID().toString())
.name("randomEvent")
.data("some data")
)
}
}
}
const eventSource = new EventSource(url);
eventSource.addEventListener('randomEvent', (e) =>
console.log(e.data)
);
eventSource.onerror = (e) => console.log(e);
好的,这似乎是 Stackblitz 的服务工作者的问题。我刚刚在 Chrome 的普通控制台中实施了相同的 client-side 解决方案,并且不再发生断开连接。