Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将现有Spring Websocket处理程序迁移到使用rsocket_Spring_Rsocket - Fatal编程技术网

将现有Spring Websocket处理程序迁移到使用rsocket

将现有Spring Websocket处理程序迁移到使用rsocket,spring,rsocket,Spring,Rsocket,假设我有一个用于聊天消息的简单Websocket处理程序: @Override public Mono<Void> handle(WebSocketSession webSocketSession) { webSocketSession .receive() .map(webSocketMessage -> webSocketMessage.getPayloadAsText()) .map(text

假设我有一个用于聊天消息的简单Websocket处理程序:

@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
交互模型。