Spring Webflux:将服务器发送事件推送给特定用户
Posted
技术标签:
【中文标题】Spring Webflux:将服务器发送事件推送给特定用户【英文标题】:Spring Webflex: Push Server Sent Event to Specific Users 【发布时间】:2020-07-25 04:33:09 【问题描述】:我一直关注this 以供参考。我正在开发一个具有经过身份验证的用户的 spring-boot 应用程序。登录后,用户将通过访问特定 URL 来订阅事件。
这个 spring-boot 应用程序也将支持 MQTT(或者可能只是 HTTP 请求),其中将发送特定用户的信息。如果用户已订阅,我想然后使用 Web Flux/SSE 向用户显示此发送的信息。
许多用户可以在任何给定时间登录,并且他们都订阅了更新。如何管理每个登录用户的所有不同接收器?
我相信在访问经过身份验证的 URL 时可以获得当前用户,但是有什么方法可以存储每个登录用户的所有接收器?
我很感激。
【问题讨论】:
您可以使用一个接收器,然后为每个用户订阅多次。 当我收到一个用户的数据时,它只针对一个用户。当我调用 sink.next 推送数据时,我如何指定哪个用户正在获取它?许多用户将被订阅。 您可以使用过滤器,将您的条件放入其中 我正在努力跟进。我知道我可以使用 Java 8 过滤器,但我会过滤什么?我获得的 MQTT 或 HTTP 数据将针对特定主题/id,因此我可以确定它属于哪个用户。但是,我可以向过滤器添加什么参数,以便我知道消息将发送给正确的用户? 【参考方案1】:你已经在评论区得到答案了。
假设这是您要发布的消息格式。
public class Message
private int intendedUserId;
private String message;
// getters and setters
只有 1 个处理器并从处理器接收。
FluxProcessor<Message> processor;
FluxSink<Message> sink;
通过 sink 推送所有消息。
sink.next(msg);
您的控制器或多或少是这样的。在这里,我假设您有一些方法可以获取用户 ID authtoken.getUserId()
。这里的过滤器是 Flux 的一部分。
@GetMapping(value = "/msg", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Message> getMessages()
return processer
.filter(msg -> msg.getIntendedUserId() == authtoken.getUserId());
【讨论】:
以上是关于Spring Webflux:将服务器发送事件推送给特定用户的主要内容,如果未能解决你的问题,请参考以下文章
服务器发送事件 Spring Webflux 返回事件名称以响应来自休息控制器的响应
Spring Webflux 服务器发送事件 Thymeleaf
如何使用 Spring webflux 向 webclient 发送实时进度?
技术使用 Spring 5 的 WebFlux 开发反应式 Web 应用