如何将服务器发送事件对象保存到我的数据库中?

问题描述 投票:0回答:2

我正在尝试构建一个通知系统,在我的后端,在收到来自第三方的 Webhook 后,将通知前端特定状态,并决定继续实施服务器发送事件春季启动。在经历了数十次相同的实现之后,我发现常见的做法是:

  1. 让您的客户在您的后端点击订阅 API
  2. 创建SseEmitter类的对象并将其存储在内存中的HashMap或ArrayList中
  3. 获取内存中存储的事件,以便在所需事件发生时发送通知

但是,我的问题是我无法在生产级代码中将这些 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。这些东西都不起作用。

java spring spring-boot client-server server-sent-events
2个回答
1
投票

但是我的问题是我无法存储这些 SseEmitter 对象 内存中,生产级代码中

将这些 SSE 会话存储在将 id 键映射到发射器作为值的哈希图中,本质上没有什么坏处。 (确保处理断开连接/哈希图清理)。

我认为为了您的预期目的而坚持这些课程是不可能的。服务器无法使用 SSE 发起与客户端的连接。


0
投票

只是想知道您是否找到了内存中响应对象存储问题的解决方案?

© www.soinside.com 2019 - 2024. All rights reserved.