【问题标题】:Spring Webflex: Push Server Sent Event to Specific UsersSpring Webflux:将服务器发送事件推送给特定用户
【发布时间】: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,因此我可以确定它属于哪个用户。但是,我可以向过滤器添加什么参数,以便我知道消息将发送给正确的用户?

标签: spring spring-boot spring-security spring-webflux server-sent-events


【解决方案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());
}

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2021-04-22
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2019-02-09
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多