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.

Spring boot, no es posible cambiar el valor de las propiedades en tiempo de ejecución usando spring cloud config, @RefreshScope no funciona.

Estoy utilizando Spring Cloud Config para cambiar el valor de una propiedad en tiempo de ejecución sin reiniciar la aplicación.

Tengo un repositorio que tiene diferentes perfiles y, en base al perfil, tengo varias aplicaciones ejecutándose desde un solo repositorio.

Tengo una clase de servicio con una anotación @Profile(“change-feed”).

@Service
@Slf4j
@Profile("change-feed")
@RefreshScope
public class ProcessorFeedService extends ProcessorService {

    private final boolean toggle;
    private final FeedPublisher publisher;

    public ProcessorFeedService(FeedPublisher publisher, @Value("${feed.toggle}") boolean toggle) {
        this.publisher = publisher;
        this.toggle = toggle;
    }

    public void handler(List<jsonnode> docs) {
        for (JsonNode document : docs) {
            try {
                if (toggle) {
                    // hacer algo
                    publisher.publish();
                } else {
                    // hacer algo más
                    inventoryChangePublisher.publish(document);
                }
            } catch (Exception ex) {
                log.error("Se produjo una excepción al procesar {}", document.toString(), ex);
            }
        }
    }
}

Tengo un archivo de propiedades llamado “application-change-feed” y otro archivo llamado “application-test” en el cual se encuentra la propiedad “feed.toggle” en el repositorio de configuración en la nube.

El archivo application.properties tiene estas propiedades para habilitar los puntos de acceso de actualización, entre otros.

management.endpoints.web.exposure.include=info,health,env,refresh,bindings
management.endpoint.health.show-details=always
management.health.binders.enabled=true
spring.profiles.active=test
spring.profiles.include=change-feed

Después de cambiar el valor de la propiedad en el archivo de configuración en la nube, al acceder al punto de acceso de actualización `https://{url}/actuator/refresh` se devuelve la propiedad cambiada. Sin embargo, no se refleja el valor actualizado en la aplicación. La aplicación solo utiliza el valor antiguo.

¿Qué estoy haciendo mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la anotación @RefreshScope en la clase ProcessorFeedService no está funcionando como se esperaba. Esta anotación es necesaria para asegurar que los valores de los campos anotados con @Value se recarguen desde la configuración actualizada durante la ejecución.

    Una posible solución es agregar la anotación @RefreshScope en la clase padre, ProcessorService, para que todas las clases hijas hereden este comportamiento. Otra solución es actualizar manualmente los beans anotados con @RefreshScope utilizando el bean RefreshEndpoint invocando su método refresh().

    Asegúrese de que el bean RefreshEndpoint haya sido expuesto agregando la siguiente propiedad al archivo application.properties:

    management.endpoints.web.exposure.include=info,health,env,refresh,bindings
    

    Después de invocar el método refresh(), el valor de la propiedad actualizada debería reflejarse en la aplicación.

Comments are closed.