java - 是否建议使用 Server Sent Events 通过持续查询数据库来推送通知?

标签 java spring-boot websocket push-notification server-sent-events

我想通过不断查询数据库将实时通知(登录用户的 DTO 对象)推送到客户端。我正在使用服务器端事件来实现相同的目的。但是,我在实现这一目标时面临的问题很少。我在 javascript 中使用 EventSource API。

  • 在无限循环内轮询

  • 由于我的数据位于数据库中,因此我经常需要运行查询以获取最新条目并使用 executor.execute(()->{ while(true) {emitter.send(data)} } Thread.sleep(5000))直到用户退出。 (a) 在无限循环中查询数据库和 (b) 创建新的 ExecutorService 对象会导致 JDBC 池耗尽异常并最终卡住应用程序。
  • 使用 Spring 启动 @Scheduled
    这也不起作用,因为我需要登录 user_id,我无法使用 SpringContextHolder.getAuthentication 进入 @Scheduled 注释方法中因为这个 Cron 不是由用户启动的。

  • 我在这里选择 SSE 而不是 Web Sockets 是不是做错了,或者有什么方法可以为这个特定用例实现服务器端?

    请帮助/指导我。

    最佳答案

    如果您想将事件推送到您的客户端,您最好在后端也有事件概念,而不是轮询。如果你想轮询你的数据库,你最好让客户端来做。 SSE 或 websocket 在该决定中无关紧要。

    CDI 事件可能是满足您需求的合适解决方案。

  • 创建 EntityForLoggedInUsersChanged事件类。
  • 注入(inject) Event<EntityForLoggedInUsersChanged>在您的服务中更改与登录用户相关的实体。当他们这样做时触发事件。
  • 创建一个服务,将 @Observe那些事件,构造你要推送的dto,获取到相关用户的 channel ,然后推送。
  • 关于java - 是否建议使用 Server Sent Events 通过持续查询数据库来推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60156197/

    相关文章:

    java - 以编程方式更改 Eclipse 中的文件关联

    java - 在 Eclipse 中链接到生成的 Java protobuf 代码

    java - Spring Boot 中的 @IntegrationTest 与 'normal' 单元测试结合运行时会使协和测试失败

    websocket - 实时应用需要推送服务建议

    c++ - websocket计时器滴答后 boost asio短读错误

    java - 如何从 Java 控制台程序连接到 WebSocket?

    java - 如何使用 JDA 将带有消息的文件发送到 Discord?

    java - 奇怪的 java.sql.SQLException : Column 'fk_Content' not found

    Spring 启动 + PostgreSQL : Error creating bean with name 'entityManagerFactory' defined in class path resource

    java - 与 main 和 test 一起的 IntelliJ 集成测试文件夹