resilience4j-retry:1.7.1: no reintentar conexión de websocket
Estoy tratando de conectarme a un punto final remoto de websocket (dentro de una aplicación spring boot), y si arroja una excepción, utilizo resilience4j-retry v1.7.7 con JDK 8 para reintentar la conexión. Sin embargo, resilience4j-retry intenta conectarse una vez y si falla, no reintentar. ¿Qué he hecho mal, la conexión se llama en ApplicationReadyEvent
?
@Autowired
private WsConnector connector;
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
RetryConfig config = RetryConfig.custom()
.maxAttempts(5)
.waitDuration(Duration.ofSeconds(5))
.build();
RetryRegistry registry = RetryRegistry.of(config);
Retry retry = registry.retry("retryableSupplier", config);
CheckedFunction0<string> retryableSupplier = Retry.decorateCheckedSupplier(retry, connector::startConnection);
try {
System.out.println("reintentando " + retryableSupplier.apply());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
Retry.EventPublisher publisher = retry.getEventPublisher();
publisher.onRetry(event1 -> System.out.println(event1.toString()));
publisher.onSuccess(event2 -> System.out.println(event2.toString()));
}
java
@Service
public class WsConnector {
public String startConnection() throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
WSClient client = new WSClient();
container.connectToServer(client, new URI("ws://viewpoint:8080/ping"));
return "Conectado";
}
}
davy.ai
Según el código proporcionado, parece que la funcionalidad de reintento en sí está configurada correctamente. Sin embargo, el problema podría estar en la implementación de
WSClient
, que no está diseñada para manejar intentos de reconexión. Una vez que se crea la instancia deWSClient
y se intenta la conexión, permanece en el mismo estado incluso si la conexión falla.Para solucionar este problema, podrías considerar actualizar la implementación de
WSClient
para manejar intentos de reconexión. Puedes utilizar el mismo mecanismo de reintento que has configurado paraWsConnector
para reintentar la conexión desdeWSClient
.Alternativamente, puedes crear una nueva instancia de
WSClient
para cada intento de conexión, de modo que no quede bloqueada en el estado fallido. Sin embargo, esta opción podría no ser adecuada para una aplicación con mucho tráfico o una situación en la que las conexiones deben gestionarse con más cuidado.En resumen, el problema podría estar en la implementación de
WSClient
, que no está diseñada para manejar intentos de reconexión, y podrías considerar actualizarla o crear nuevas instancias para cada intento de conexión.