我想通过不断查询数据库将实时通知(登录用户的 DTO 对象)推送到客户端。我正在使用服务器端事件来实现相同的目的。但是,我在实现这一目标时面临的问题很少。我在 javascript 中使用 EventSource API。
由于我的数据位于数据库中,因此我经常需要运行查询以获取最新条目并使用
executor.execute(()->{ while(true) {emitter.send(data)} } Thread.sleep(5000))
直到用户退出。 (a) 在无限循环中查询数据库和 (b) 创建新的 ExecutorService 对象会导致 JDBC 池耗尽异常并最终卡住应用程序。这也不起作用,因为我需要登录 user_id,我无法使用
SpringContextHolder.getAuthentication
进入 @Scheduled 注释方法中因为这个 Cron 不是由用户启动的。 我在这里选择 SSE 而不是 Web Sockets 是不是做错了,或者有什么方法可以为这个特定用例实现服务器端?
请帮助/指导我。
最佳答案
如果您想将事件推送到您的客户端,您最好在后端也有事件概念,而不是轮询。如果你想轮询你的数据库,你最好让客户端来做。 SSE 或 websocket 在该决定中无关紧要。
CDI 事件可能是满足您需求的合适解决方案。
EntityForLoggedInUsersChanged
事件类。 Event<EntityForLoggedInUsersChanged>
在您的服务中更改与登录用户相关的实体。当他们这样做时触发事件。 @Observe
那些事件,构造你要推送的dto,获取到相关用户的 channel ,然后推送。 关于java - 是否建议使用 Server Sent Events 通过持续查询数据库来推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60156197/