Как определить, является ли соединение RSocket успешным?

#spring-boot #rsocket #spring-boot-rsocket

#весенняя загрузка #rsocket #spring-boot-rsocket

Вопрос:

У меня есть следующая программа, с помощью которой я могу обнаружить сбой соединения, т.е. 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);
 

Ответ №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 на ваш серверный сервер. Вы можете определить время и подтвердить, что у вас исправное соединение, записать задержки и успехи / сбои.

Комментарии:

1. Понятно. Но если есть обработчики для уведомления о сбросе соединения и ошибках, т.Е. doOnError, doOnTermination и т. Д., Почему у нас не может быть метода для уведомления об успешном соединении? в чем ограничение? Я реализовал решение, аналогичное тому, которое вы предложили, т.Е. Механизм опроса с сервером через регулярные промежутки времени, чтобы узнать, получаю ли я ответ обратно, таким образом, удостоверяя, что соединение исправно. Я думаю, что это так чисто.

2. 100% согласен. Я думаю, что на данный момент для этого потребуется PR, чтобы выявить это конкретное событие, успешное повторное подключение наблюдаемым способом. Это может быть возможно, и я просто не знаю, как это сделать, поэтому, вероятно, стоит поднять запрос функции на github.com/rsocket/rsocket-java

3. Спасибо Юрию за ваш ответ. Я создал проблему с улучшением rsocket-java. github.com/rsocket/rsocket-java/issues/965