【问题标题】:How to detect if RSocket connection is successfull?如何检测Socket连接是否成功?
【发布时间】:2020-12-15 10:29:34
【问题描述】:

我有以下程序,我可以通过它检测连接失败,即 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);

【问题讨论】:

    标签: spring-boot rsocket spring-boot-rsocket


    【解决方案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");
            }
        }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 明白。但是,如果有通知连接断开和错误的处理程序,即 doOnError、doOnTermination 等,为什么我们不能有通知连接成功的方法?有什么限制?我已经实现了一个与您建议的解决方案类似的解决方案,即定期使用服务器的轮询机制来查看是否收到响应,从而证明连接良好。我觉得很干净。
      • 100% 同意。我认为目前需要 PR 来公开这个特定事件,以可观察的方式成功重新连接。这可能是可能的,我只是不知道如何,所以可能值得在 github.com/rsocket/rsocket-java 上提出功能请求
      • 感谢尤里的回复。我用 rsocket-java 创建了一个增强问题。 github.com/rsocket/rsocket-java/issues/965
      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多