es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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";
}
}

Tags:  , , ,

Answer

  1. Avatar for 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 de WSClient 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 para WsConnector para reintentar la conexión desde WSClient.

    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.

Comments are closed.