#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