将现有Spring Websocket处理程序迁移到使用rsocket
假设我有一个用于聊天消息的简单Websocket处理程序:将现有Spring Websocket处理程序迁移到使用rsocket,spring,rsocket,Spring,Rsocket,假设我有一个用于聊天消息的简单Websocket处理程序: @Override public Mono<Void> handle(WebSocketSession webSocketSession) { webSocketSession .receive() .map(webSocketMessage -> webSocketMessage.getPayloadAsText()) .map(text
@Override
public Mono<Void> handle(WebSocketSession webSocketSession) {
webSocketSession
.receive()
.map(webSocketMessage -> webSocketMessage.getPayloadAsText())
.map(textMessage -> textMessageToGreeting(textMessage))
.doOnNext(greeting-> greetingPublisher.push(greeting))
.subscribe();
final Flux<WebSocketMessage> message = publisher
.map(greet -> processGreeting(webSocketSession, greet));
return webSocketSession.send(message);
}
@覆盖
公共单声道句柄(WebSocketSession WebSocketSession){
webSocketSession
.receive()
.map(webSocketMessage->webSocketMessage.getPayloadAsText())
.map(textMessage->textMessageToGreeting(textMessage))
.doOnNext(问候语->问候语Publisher.push(问候语))
.subscribe();
最终流量消息=发布者
.map(问候->过程问候(webSocketSession,问候));
返回webSocketSession.send(消息);
}
一般来说,在这里需要做什么?它将使用rsocket协议 Spring WebFlux中的RSocket控制器看起来更像一个RestController,而不是WebSocketHandler。所以上面的例子很简单:
@控制器
公共类RSocketController{
@MessageMapping(“say.hello”)
公共Mono saHello(字符串名称){
返回Mono.just(“服务器打招呼”+name);
}
}
这相当于requestResponse
方法
如果这个答案不能让你满意,请描述更多你想要达到的目标
编辑
如果要向所有客户端广播消息,它们需要订阅相同的流量
公共类问候发布者{
最终FluxProcessor处理器;
最终焊剂油墨槽;
公众问候出版商(){
this.processor=DirectProcessor.create().serialize();
this.sink=processor.sink();
}
公共问候语(字符串问候语){
这个。水槽。下一个(问候);
}
公共交通问候语(){
返回处理器;
}
}
@控制器
公共类迎宾控制器{
最终GreetingPublisher GreetingPublisher=新GreetingPublisher();
@MessageMapping(“问候语.添加”)
公共void addGreetings(字符串名称){
addgreetingpublisher.addGreetings(“你好,”+name);
}
@消息映射(“问候语”)
公共流量sayHello(){
return greetingPublisher.greetings();
}
}
您的客户端必须使用
requestStream
方法调用greetings
端点。无论您使用greetingPublisher.addGreetings()
将消息发送到何处,它都将广播到所有客户端。来源:我的代码中的一个将消息广播到所有客户端,您如何使用RSocket做到这一点?您所说的“您的客户端必须使用requestStream方法调用问候端点”是什么意思?在GreetingController
中检查并输入greetings
端点返回流量,因此需要使用requestStream
方法调用它。greetings.add
不返回任何内容,只接受一个参数,因此它是一个fireAndForget
交互模型。