微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot 2.4 RSocket 反复检测丢失的连接

如何解决Spring Boot 2.4 RSocket 反复检测丢失的连接

我使用以下配置将 RsocketClient 连接到 RsocketServer。这很好用。我想检测连接丢失。这可以通过注册到 RsocketClient 的底层 rsocket 的 OnClose Mono 来很好地工作。但只有一次。如果我反复连接丢失和重新连接,如何检测关闭

requester = rsocketRequesterBuilder.setupRoute("shell-client").setupData(CLIENT_ID)
                        .setupMetadata(accesstoken,BearerTokenMetadata.BEARER_AUTHENTICATION_MIME_TYPE)
                        .rsocketStrategies(rsocketStrategies).
                        rsocketConnector(connector -> connector.acceptor(responder).reconnect(Retry.backoff(1000,Duration.ofMillis(500)).dobeforeRetry(x->{log.info("Retry");
                        
                        
                        
                        }).doAfterRetry(x->{log.info(x.toString());})))
                        .tcp("x.y.z.40",8080);
                
               
                RSocket r=requester.rsocketClient().source().block();
                r.onClose().doOnError(x->{
                    log.info("Error");}).doFinally(x->{
                    log.info("disconnected");
                }).subscribe();

解决方法

您可以使用以下代码实现所需的行为:

 requester
       .rsocketClient()
       .source()
       .flatMap(rsocket -> rsocket.onClose())
       .repeat()
       .retry()
       .subscribe();

在上面的例子中,一旦连接丢失,rsocket.onClose() 将发送一个终端信号。由于您已经安装了重新连接功能,下次订阅 RSocketClient.source() 将导致重新建立​​连接。因此,一旦发生这种情况,您将收到一个新的 rsocket 实例,并将在 onClose 运算符内再次订阅 flatMap 流。

为了重复这个操作,我们可以使用 .repeatretry 所以每当 onClose 终止(这是断开连接的指示)时,对 RSocketClient.source 的订阅将被重复并且您将能够获得新连接并再次开始收听 onClose

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。