使用RSocket将Spring 5 WebFlux服务器中的通知推送到特定的已连接客户端

时间:2019-11-16 21:42:15

标签: spring-boot spring-webflux spring-websocket rsocket rsocket-java

情况如下:

作为客户端AB使用RSocket协议(通过WebSocket)(以及相应的连接A和{{1 }}已建立),则可以选择将其每个特定事件(Bevent A)通知每个事件,因此应在客户端(event B )。

更清楚地说,这是如何使用event X -> action on client X实现所需的方案:

  1. 客户端打开WS连接,已创建会话并为其分配了唯一的WebSockets
  2. 服务器上发生了包含session ID的事件。
  3. 服务器找到相应的session ID(例如从WS session中)并使用它发送事件。
  4. 客户端接收事件并在其一方采取必要的措施。

如何使用RSocket实现相同的流程?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以通过设置有效载荷来实现。

服务器:

@Controller
public class ServerController {
    private static final Map<String, RSocketRequester> REQUESTER_MAP = new HashMap<>();

    @ConnectMapping("client-id")
    void onConnect(RSocketRequester rSocketRequester, @Payload String clientId) {
        rSocketRequester.rsocket()
                .onClose()
                .subscribe(null, null,
                        () -> REQUESTER_MAP.remove(clientId, rSocketRequester));
        REQUESTER_MAP.put(clientId, rSocketRequester);
    }
}

客户

Mono<RSocketRequester> rSocketRequesterMono(
        RSocketRequester.Builder rSocketRequesterBuilder, // preconfigured bean
        RSocketMessageHandler rSocketMessageHandler, // preconfigured bean
        URI webSocket, String clientId) {
    return rSocketRequesterBuilder
            .rsocketFactory(rsocketFactory -> rsocketFactory
                    .addSocketAcceptorPlugin(socketAcceptor ->
                            rSocketMessageHandler.responder()))
            .setupRoute("client-id")
            .setupData(clientId)
            .connectWebSocket(webSocket);
}

现在,您可以在服务器端通过客户端获取RSocketRequester并调用特定的客户端。