style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Actualización automática de archivos de propiedades con Spring

Hace algunos días en el trabajo tuvimos la necesidad de que en uno de los componentes que tenemos en desarrollo el sistema de activación se implementará por medio de un archivo de propiedades.

La decisión ya estaba tomada y la mayoría construido, así que solo me quedaba investigar como hacer que la aplicación una vez desplegada en modo productivo tomará los cambios que se hicieran en un archivo de propiedades externo. La idea de obtener el contexto de Spring y hacer un .refresh nunca me gusto, aunque fue una de las primeras pruebas que hice y el resultado algunas veces termina en un reinicio de todo el contexto, fea la cosa.

Buscando por google me encontré con algunas personas que recomendaban springframework-addons de unicon, la cual tiene como objetivo que spring se enteré automáticamente de los cambios que sufran los archivos que nosotros le indiquemos, en este caso mi archivo de propiedades.


Agregando la dependencia.

No creo tener que explicar algo, solo agregamos al POM nuestra dependencia con la versión que corresponda.

<dependency>
    <groupId>net.unicon.springframework</groupId>
    <artifactId>springframework-addons</artifactId>
    <!-- See above for the latest released version number -->
    <version>${springframework-addons.version}</version>
</dependency>


Cargando los archivos.

               <spring:bean id="configproperties"
                        class="net.unicon.springframework.addons.properties.ReloadablePropertiesFactoryBean">
                        <spring:property name="locations" value="file:/Users/043h68/Documents/archivo.properties" />
                </spring:bean>
               
                <spring:bean id="propertyPlaceholderConfigurer"
                        class="net.unicon.springframework.addons.properties.ReloadingPropertyPlaceholderConfigurer">
                        <spring:property name="properties" ref="configproperties" />
                </spring:bean>

Como podemos ver hemos sustituido PropertyPlaceholderConfigurer por un bonito ReloadablePropertiesFactoryBean que nos proporciona la funcionalidad de recarga que buscamos.


Configurando nuestro Timer

Ya hemos cargado nuestro archivo y podemos utilizarlo como siempre lo hemos hecho, pero aún Spring no se va a enterar si éste ha cambiado, para eso haremos un timer, que será el chismoso que nos avisará si algún archivo cambia.

        <spring:bean id="timer"
                        class="org.springframework.scheduling.timer.TimerFactoryBean">
                        <spring:property name="scheduledTimerTasks">
                                <spring:bean id="reloadProperties"
                                        class="org.springframework.scheduling.timer.ScheduledTimerTask">
                                        <spring:property name="period" value="3000" />
                                        <spring:property name="runnable">
                                                <spring:bean class="net.unicon.springframework.addons.properties.ReloadConfiguration">                                      
                                                        <spring:property name="reconfigurableBeans">
                                                                <spring:list>
                                                                        <spring:ref bean="configproperties" />
                                                                </spring:list>
                                                        </spring:property>
                                                </spring:bean>
                                        </spring:property>
                                </spring:bean>
                        </spring:property>
                </spring:bean>

Como vemos es un timer normal que lo único que va a estar haciendo es llamar a la clase ReloadConfiguration y esta es la que va a estar buscando cambios en configproperties o lo que es lo mismo en los archivos que tengamos listados ahí.

Les recomiendo dar un vistazo a la clase ReloadConfiguration, en general todo el proyecto es muy interesante y útil, ya que la mayoría de nosotros utilizamos archivos de propiedades en los proyectos que tenemos y en más de una reunión seguramente hemos escuchado: "Pero los archivos de propiedades no, por que tenemos que volver a desplegar". Se acabaron los pretextos. :P

Repositorio: https://github.com/Unicon/springframework-addons

Ustedes como lo hubieran solucionado ? :D

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

file watcher

Para no tener que poner un timer, yo hubiera usado un filewatcher. Revisa la clase java.nio.file.Path, método register.

Imagen de 043h68

Buena opción.

Excelente opción, que no he utilizado pero según la documentación viene desde java 7. Igual yo debía utilizar java 6 y sin mucha holgura de actualizar a java 7. :(

Gracias !

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">