如何使用 Spring Boot RSocket后端和 Angularrsocket-js将通知从服务器推送到客户端?

问题描述

我打算将 RSocket 用于我的通知系统。我想将 Spring Boot RSocket 用于我的后端 (Java),而对于我的前端,我将使用 Angular 使用 rsocket-js

我能够快速启动一个请求流交互模型,我可以在其中提取系统中的所有通知。查看我的后端的代码片段:

  @MessageMapping("streams")
  public Flux<Notification> requestStream() {

    log.info("Streaming to notifications...");

    return streamEventService.retrieveAllNotifications().log();

  }

现在在我的前端,我有以下代码片段:

export class RsocketClientService {

  // backend ws endpoint
  private readonly wsURL = 'ws://localhost:7000/notification';

  client: any;
  socket: any

  constructor() { 
    this.client = new RSocketClient({
      serializers: {
          data: JsonSerializer,Metadata: IdentitySerializer
      },setup: {
          keepAlive: 10000,lifetime: 180000,dataMimeType: 'application/json',MetadataMimeType: 'message/x.rsocket.routing.v0',payload: {
            data: 23
          }
      },transport: new RSocketWebSocketClient({
          url: this.wsURL
      }),responder: new EchoResponder()
    });
  }

  public connect() {
    console.log("initializeSocket...")
    this.client.connect().subscribe({
      onComplete: (socket: any) => {
        this.socket = socket;
        this.socket.connectionStatus().subscribe( (status: any) => {
            console.log("Connection status? ",status);
        });
      },onError: (error: any) => {
        console.error("Connection onError? " + error);
      },onSubscribe: (cancel: any) => {
        console.log("Connection onSubscribe? cancel?");
      }
    });
  }

 public retrieveNotifications() {
    this.socket.requestStream({
      data: null,Metadata: String.fromCharCode('streams'.length) + 'streams'
    })
    .subscribe({
      onComplete: () => {
        console.log("onComplete?");
      },onError: (error: any) => {
        console.error("onError? error: " + error);
      },onNext: (payload: any) => {
        console.log("onNext? payload: ",payload);
      },onSubscribe: (subscription: any) => {
        console.log("onSubscribe?");
        subscription.request(1000000);
      },});
  }

我在 UI 中有一个按钮,如果单击该按钮将调用方法 retrieveNotifications,该方法订阅后端 requestStream 中的 rsocket 消息映射方法

一切正常,我可以看到我的回复。现在我的问题是,如果在我的服务器上有一个新数据插入到数据库中,例如,那么我如何发送通知消息从我的后端服务器到前端 说“嘿!新数据被推送到数据库中。”我有点被困在服务器如何能够以某种方式使用火而忘记客户端。

解决方法

您希望在连接建立时服务器端向客户端发送请求。

您可以从服务器获取此连接的 RSocketRequester,然后使用它创建四种方法(FNF、请求响应、请求流、流流)之一以向客户端发送请求。 在客户端,您可以通过上述四种方法之一接收 EchoResponder 类中的数据。

,

看起来您需要创建一个返回空值的新控制器函数,当您在数据库中插入一个对象时,您将该对象从该函数传递到前端,并以 angular 方式连接到它。 ..尝试检查此链接是否有火而忘记的方法...希望这有助于https://www.baeldung.com/spring-boot-rsocket