Spring boot 服务器中途重新启动时,RSocket reconnect不工作
我正在尝试测试RSocket的重新连接功能,但在服务器停机和重新启动之间,RSocket无法工作 步骤1:在服务器关闭时启动客户端Spring boot 服务器中途重新启动时,RSocket reconnect不工作,spring-boot,rsocket,spring-boot-rsocket,Spring Boot,Rsocket,Spring Boot Rsocket,我正在尝试测试RSocket的重新连接功能,但在服务器停机和重新启动之间,RSocket无法工作 步骤1:在服务器关闭时启动客户端 16:02:35.351 [main] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.processId: 55104 (auto-detected) 16:02:35.515 [main] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machi
16:02:35.351 [main] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.processId: 55104 (auto-detected)
16:02:35.515 [main] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machineId: 10:e7:c6:ff:fe:31:38:c0 (auto-detected)
16:02:35.560 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x7b01559f] Created a new pooled channel, now 1 active connections and 0 inactive connections
16:02:35.569 [reactor-tcp-nio-2] DEBUG reactor.netty.transport.TransportConfig - [id: 0x7b01559f] Initialized pipeline DefaultChannelPipeline{(reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
doAfterRetry ===>io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:7999
16:02:36.619 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x8a39ea36] Created a new pooled channel, now 1 active connections and 0 inactive connections
16:02:36.620 [reactor-tcp-nio-2] DEBUG reactor.netty.transport.TransportConfig - [id: 0x8a39ea36] Initialized pipeline DefaultChannelPipeline{(reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
doAfterRetry ===>io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:7999
16:02:37.625 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x9754e5dd] Created a new pooled channel, now 1 active connections and 0 inactive connections
16:02:37.625 [reactor-tcp-nio-2] DEBUG reactor.netty.transport.TransportConfig - [id: 0x9754e5dd] Initialized pipeline DefaultChannelPipeline{(reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
doAfterRetry ===>io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:7999
步骤2:服务器已启动。重新连接成功
16:08:31.359 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1] Created a new pooled channel, now 1 active connections and 0 inactive connections
16:08:31.359 [reactor-tcp-nio-2] DEBUG reactor.netty.transport.TransportConfig - [id: 0x67b9f3a1] Initialized pipeline DefaultChannelPipeline{(reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
16:08:31.862 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999] Registering pool release on close event for channel
16:08:31.863 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999] Channel connected, now 1 active connections and 0 inactive connections
16:08:31.863 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999] onStateChange(PooledConnection{channel=[id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999]}, [connected])
16:08:31.865 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999] onStateChange(ChannelOperations{PooledConnection{channel=[id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999]}}, [configured])
16:08:31.891 [reactor-tcp-nio-2] DEBUG io.rsocket.FrameLogger - sending ->
Frame => Stream ID: 0 Type: SETUP Flags: 0b0 Length: 75
Data:
16:08:31.957 [reactor-tcp-nio-2] DEBUG reactor.netty.channel.FluxReceive - [id: 0x67b9f3a1, L:/127.0.0.1:57689 - R:localhost/127.0.0.1:7999] FluxReceive{pending=0, cancelled=false, inboundDone=false, inboundError=null}: subscribing inbound receiver
16:08:31.969 [reactor-tcp-nio-2] DEBUG io.rsocket.FrameLogger - sending ->
Frame => Stream ID: 1 Type: REQUEST_STREAM Flags: 0b100000000 Length: 57 InitialRequestN: 9223372036854775807
Metadata:
步骤3:关闭服务器
16:10:10.993 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1, L:/127.0.0.1:57689 ! R:localhost/127.0.0.1:7999] Channel closed, now 0 active connections and 0 inactive connections
null
16:10:10.999 [reactor-tcp-nio-2] DEBUG org.springframework.core.codec.CharSequenceEncoder - Writing "ClientName:1607847010998"
16:10:11.008 [reactor-tcp-nio-2] ERROR reactor.core.publisher.Operators - Operator called default onErrorDropped
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.nio.channels.ClosedChannelException
Caused by: java.nio.channels.ClosedChannelException: null
16:10:11.008 [reactor-tcp-nio-2] ERROR reactor.core.publisher.Operators - Operator called default onErrorDropped
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.nio.channels.ClosedChannelException
Caused by: java.nio.channels.ClosedChannelException: null
16:10:11.010 [reactor-tcp-nio-2] DEBUG reactor.netty.ReactorNetty - [id: 0x67b9f3a1, L:/127.0.0.1:57689 ! R:localhost/127.0.0.1:7999] Non Removed handler: RSocketLengthCodec, context: ChannelHandlerContext(RSocketLengthCodec, [id: 0x67b9f3a1, L:/127.0.0.1:57689 ! R:localhost/127.0.0.1:7999]), pipeline: DefaultChannelPipeline{(RSocketLengthCodec = io.rsocket.transport.netty.RSocketLengthCodec), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
16:10:11.010 [reactor-tcp-nio-2] DEBUG reactor.netty.resources.DefaultPooledConnectionProvider - [id: 0x67b9f3a1, L:/127.0.0.1:57689 ! R:localhost/127.0.0.1:7999] onStateChange(ChannelOperations{PooledConnection{channel=[id: 0x67b9f3a1, L:/127.0.0.1:57689 ! R:localhost/127.0.0.1:7999]}}, [disconnecting])
完成上述步骤后,RSocket未重新连接。下面是我的程序。请有人帮我检查一下,并提出建议
RSocketStrategies strategies = RSocketStrategies.builder()
.encoders(e -> e.add(new Jackson2JsonEncoder()))
.decoders(e -> e.add(new Jackson2JsonDecoder()))
.build();
RSocketRequester r = RSocketRequester.builder()
.rsocketConnector(connector ->
connector.reconnect(Retry.indefinitely().doAfterRetry(e-> System.out.println("doAfterRetry ===>"+e.failure())))
).dataMimeType(MediaType.APPLICATION_JSON)
.rsocketStrategies(strategies)
.tcp("localhost", 7999);
于12月15日更新
以下代码在步骤2之后发送请求。断开连接后,它无法恢复流。我确信我的代码中一定遗漏了什么。好心帮忙
requester.route("route_name")
.data("RequestData")
.retrieveFlux(MyResponse.class)
.doOnError(ex ->{
System.out.println("doOnError"+ex);
}).doOnCancel(()->{
System.out.println("doOnCancel");
}).doOnComplete(()-> {
System.out.println("doOnCancel");
})
.subscribe(result -> {
System.out.println("===>"+result);
});
重新连接方法具有广泛的Javadoc。此功能的主要目的是建立单个共享连接,无论一次可能有多少用户: 启用此选项后,此类的connect方法将返回 维护单个共享RSocket的特殊Mono
重试
确定在放弃之前尝试连接的持续时间,但一旦停止尝试,或一旦建立连接然后丢失,它将不会自动再次尝试连接
单个请求的下游订阅服务器仍然需要自己的重试逻辑
确定是否或何时重试失败的请求
触发共享重新连接
因此,每个单独请求的需要决定是否再次尝试连接,而重新连接
的重试
决定每个共享重新连接的重试逻辑
请务必查看Javadoc中相应的代码片段。重新连接方法包含大量Javadoc。此功能的主要目的是建立单个共享连接,无论一次可能有多少用户: 启用此选项后,此类的connect方法将返回 维护单个共享RSocket的特殊Mono
重试
确定在放弃之前尝试连接的持续时间,但一旦停止尝试,或一旦建立连接然后丢失,它将不会自动再次尝试连接
单个请求的下游订阅服务器仍然需要自己的重试逻辑
确定是否或何时重试失败的请求
触发共享重新连接
因此,每个单独请求的需要决定是否再次尝试连接,而重新连接
的重试
决定每个共享重新连接的重试逻辑
请务必查看Javadoc中相应的代码片段。您需要显示发出请求的代码。@RossenStoyanchev我已经更新了我的帖子。请检查您需要显示发出请求的代码。@RossenStoyanchev我已经更新了我的帖子。谢谢你,罗森。让我看一下与这些方法对应的java文档。顺便说一句,RSocket中是否有任何处理程序事件(doOnxxx)在连接成功时发出通知?谢谢Rossen。让我看一下与这些方法对应的java文档。顺便问一下,RSocket中是否有任何处理程序事件(doOnxxx)在连接成功时发出通知?