我正在尝试构建一个通知系统,在我的后端,在收到来自第三方的 Webhook 后,将通知前端特定状态,并决定继续实施服务器发送事件春季启动。在经历了数十次相同的实现之后,我发现常见的做法是:
但是,我的问题是我无法在生产级代码中将这些 SseEmitter 对象存储在内存中。我尝试序列化该对象,但在反序列化时会创建一个新的 SseEmitter 对象,并且与客户端的连接丢失。我该如何优雅地做到这一点?
@RestController
public class EventController {
Map<String, SseEmitter> sseEmitters = new ConcurrentHashMap<>();
@Autowired
SerializerUtils serializerUtils;
String sseEmitterSerialized = null;
@CrossOrigin
@GetMapping(value="/subscribe", consumes = MediaType.ALL_VALUE)
public SseEmitter subscribe(@RequestParam(value = "tokenId") String tokenId) throws IOException {
DefaultSseEmitter sseEmitter = new DefaultSseEmitter(Long.MAX_VALUE);
sseEmitter.send(SseEmitter.event().name("latestEvent").data("INITIALIZED"));
sseEmitter.onCompletion(() -> sseEmitters.remove(sseEmitter));
sseEmitters.put(tokenId, sseEmitter);
return sseEmitter;
}
@CrossOrigin
@PostMapping(value="/dispatchEvent", produces = MediaType.ALL_VALUE)
public void dispatchToClients(@RequestParam (value = "freshEvent") String freshEvent, @RequestParam(value = "tokenId") String tokenId)
throws IOException, ClassNotFoundException {
sseEmitters.get(tokenId).send(SseEmitter.event().name("latestEvent").data(freshEvent));
}
我尝试过序列化并转换为 JSON。这些东西都不起作用。
但是我的问题是我无法存储这些 SseEmitter 对象 内存中,生产级代码中
将这些 SSE 会话存储在将 id 键映射到发射器作为值的哈希图中,本质上没有什么坏处。 (确保处理断开连接/哈希图清理)。
我认为为了您的预期目的而坚持这些课程是不可能的。服务器无法使用 SSE 发起与客户端的连接。
只是想知道您是否找到了内存中响应对象存储问题的解决方案?