1

我有以下程序,通过它我可以检测到连接失败,即doBeforeRetry。

有人可以告诉我如何检测成功连接或重新连接。我想集成一个监控此连接的健康检查程序,但我无法捕获通知连接成功的事件。

谢谢

 requester =  RSocketRequester.builder()
                .rsocketConnector(connector -> {
                    connector.reconnect(Retry
                            .fixedDelay(Integer.MAX_VALUE,Duration.ofSeconds(1))
                            .doBeforeRetry(e-> System.out.println("doBeforeRetry===>"+e))
                            .doAfterRetry(e-> System.out.println("doAfterRetry===>"+e))
                    );
                    connector.payloadDecoder(PayloadDecoder.ZERO_COPY);
                }
                ).dataMimeType(MediaType.APPLICATION_CBOR)
                .rsocketStrategies(strategies)
                .tcp("localhost", 7999);
4

2 回答 2

1

我通过以下方法实现了成功连接或重新连接的检测。

客户端(连接初始化)

   Mono<RSocketRequester> requester =  Mono.just(RSocketRequester.builder()
                 .rsocketConnector(
                   // connector configuration goes here
                 )
                .dataMimeType(MediaType.APPLICATION_CBOR)
                .setupRoute("client-handshake") 
                .setupData("caller-name")
                .tcp("localhost", 7999)));

一台服务器端

    @ConnectMapping("client-handshake")
    public void connect(RSocketRequester requester, @Payload String callerName) {
        LOG.info("Client Connection Handshake: [{}]", callerName);
        requester
        .route("server-handshake")
        .data("I am server")
        .retrieveMono(Void.class)
        .subscribe();
    }

在客户端,当我收到以下方法的回调时,我检测到连接成功。

   @MessageMapping("server-handshake")
    public Mono<ConsumerPreference> handshake(final String response){
            LOG.info("Server Connection Handshake received : Server message [{}]", response.getCallerName());
            connectionSuccess.set(true);
            return Mono.empty();
        }else{
            throw new InitializationException("Invalid response message received from Server");
        }
    }

此外,创建了一个应用程序级心跳以确保连接的活跃性。

于 2020-12-26T04:30:55.353 回答
0

如果您想知道它是否真的健康,您可能应该有一个辅助任务来轮询 RSocket 的健康状况,方法是向您的后端发送类似自定义 ping 协议的内容。你可以计时并确认你有一个健康的连接,记录延迟和成功/失败。

于 2020-12-17T07:07:15.560 回答