Spring boot 使用spring boot rsocket捕获取消帧类型
我有一个spring boot rsocket实现,如果客户端取消或关闭其rsocket请求,那么我想取消服务器上的其他订阅注册 在spring引导服务器上的日志中,我可以看到发送或接收到一条取消消息:Spring boot 使用spring boot rsocket捕获取消帧类型,spring-boot,websocket,reactor-netty,rsocket,Spring Boot,Websocket,Reactor Netty,Rsocket,我有一个spring boot rsocket实现,如果客户端取消或关闭其rsocket请求,那么我想取消服务器上的其他订阅注册 在spring引导服务器上的日志中,我可以看到发送或接收到一条取消消息: WARN i.r.t.n.s.WebsocketServerTransport$1 [reactor-http-nio-3] received WebSocket Close Frame - connection is closing INFO r.u.Loggers$Slf4JLogger [
WARN i.r.t.n.s.WebsocketServerTransport$1 [reactor-http-nio-3] received WebSocket Close Frame - connection is closing
INFO r.u.Loggers$Slf4JLogger [reactor-http-nio-3] cancel()
如何捕获和处理此取消信号
我尝试取消端点,但这些端点无法捕获信号:
@MessageMapping("cancel")
Flux<Object> onCancel() {
log.info("Captured cancel signal");
}
@MessageMapping(“取消”)
通量onCancel(){
日志信息(“捕获的取消信号”);
}
或
@ConnectMapping(“取消”)
通量onCancel2(){
日志信息(“捕获的取消2信号”);
}
上的这个问题可能与此相关,而上的这个问题要捕获取消信号,可以使用subscribe To
onClose()
事件
在控制器中
@控制器
类RSocketConnectionController{
@连接映射(“客户端id”)
趣味onConnect(rSocketRequester:rSocketRequester,客户端ID:String){
//rSocketRequester.rsocket().dispose()//拒绝连接
rSocketRequester
.rsocket()
.onClose()
.subscribe(null,null{
log.info(“{}刚刚断开连接”,clientId)
//你想干什么就干什么
})
}
}
您的客户端需要正确发送安装框架才能调用此@ConnectMapping
。如果使用rsocket js
,则需要添加如下有效负载:
const client=new RSocketClient({
//发送/接收JSON对象,而不是字符串/缓冲区
序列化程序:{
数据:JsonSerializer,
元数据:IdentitySerializer
},
设置:{
//用于服务器上的连接映射
有效载荷:{
数据:“唯一的客户端id”,//TODO您可以在服务器端接收此数据吗
元数据:String.fromCharCode(“客户端id.length)+“客户端id”
},
//ms btw正在向服务器发送keepalive
keepAlive:60000,
.....
}
});
这不是一个明确的问题。答案是
INFO r.u.Loggers$Slf4JLogger[reactor-http-nio-3]cancel()
从原始@MessageMapping
端点设置的FluxSink
可以看到
例如:
@MessageMapping("hello")
Flux<Object> hello(@Payload String message) {
return myService.generateWorld(message);
}
sink.onCancel()
将处理从客户端到hello
端点的流量取消。谢谢,我无法完全实现这一点,但回答了下面的cancel()
问题。仍然不知道更高版本的WebSocket关闭框架
和Sink.Many()
使用
@MessageMapping("hello")
Flux<Object> hello(@Payload String message) {
return myService.generateWorld(message);
}
public Flux<Object> generateWorld(String hello) {
EmitterProcessor<Object> emitter = EmitterProcessor.create();
FluxSink<Object> sink = emitter.sink(FluxSink.OverflowStrategy.LATEST);
// doing stuff with sink here
sink.next(stuff());
// This part will handle a cancel from the client
sink.onCancel(() -> {log.info("********** SINK.onCancel ***********");});
return Flux.from(emitter));
}