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?
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:
Después de invocar el método refresh(), el valor de la propiedad actualizada debería reflejarse en la aplicación.