问题描述
我打算将 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