sesiones - spring mvc
Archivo de configuración de primavera de recarga/actualización sin reiniciar el contenedor de servlets (4)
¿Cómo puedo actualizar el archivo de configuración de Spring sin reiniciar mi contenedor de servlets?
Estoy buscando una solución que no sea JRebel.
Puedes echar un vistazo a este http://www.wuenschenswert.net/wunschdenken/archives/138 donde una vez que cambias algo en el archivo de propiedades y lo guardas los beans serán recargados con los nuevos valores.
Bueno, puede ser útil realizar tal recarga de contexto mientras pruebas tu aplicación.
Puede probar el método de refresh
de una de las clases AbstractRefreshableApplicationContext
: no refrescará sus beans instanciados previamente, pero la próxima llamada en el contexto devolverá los beans actualizados.
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class ReloadSpringContext {
final static String header = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n" +
"<!DOCTYPE beans PUBLIC /"-//SPRING//DTD BEAN//EN/"/n" +
" /t/"http://www.springframework.org/dtd/spring-beans.dtd/">/n";
final static String contextA =
"<beans><bean id=/"test/" class=/"java.lang.String/">/n" +
"/t/t<constructor-arg value=/"fromContextA/"/>/n" +
"</bean></beans>";
final static String contextB =
"<beans><bean id=/"test/" class=/"java.lang.String/">/n" +
"/t/t<constructor-arg value=/"fromContextB/"/>/n" +
"</bean></beans>";
public static void main(String[] args) throws IOException {
//create a single context file
final File contextFile = File.createTempFile("testSpringContext", ".xml");
//write the first context into it
FileUtils.writeStringToFile(contextFile, header + contextA);
//create a spring context
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(
new String[]{contextFile.getPath()}
);
//echo the bean ''test'' on stdout
System.out.println(context.getBean("test"));
//write the second context into it
FileUtils.writeStringToFile(contextFile, header + contextB);
//refresh the context
context.refresh();
//echo the bean ''test'' on stdout
System.out.println(context.getBean("test"));
}
}
Y obtienes este resultado
fromContextA
fromContextB
Otra forma de lograr esto (y tal vez una más simple) es utilizar la función Refreshable Bean de Spring 2.5+. Con un lenguaje dinámico (groovy, etc.) y la primavera, incluso puedes cambiar el comportamiento de tu frijol. Eche un vistazo a la referencia de primavera para el lenguaje dinámico :
24.3.1.2. Frijoles refrescantes
Uno de los valores añadidos (si no los más) del soporte de lenguaje dinámico en Spring es la función de "bean renovable".
Un bean renovable es un bean respaldado en lenguaje dinámico que con una pequeña cantidad de configuración, un bean respaldado en lenguaje dinámico puede monitorear los cambios en su recurso de archivo fuente subyacente, y luego recargarse cuando se cambia el archivo fuente del lenguaje dinámico (para ejemplo cuando un desarrollador edita y guarda cambios en el archivo en el sistema de archivos).
No te recomendaría que hicieras eso. ¿Qué esperas que suceda con los beans singleton modificados por su configuración? ¿Esperas que todos los singletons se recarguen? pero algunos objetos pueden contener referencias a esos singletons.
Ver también esta publicación Reinicialización de configuración automática en Spring
Para aquellos que tropezaron con esto más recientemente, la forma actual y moderna de resolver este problema es usar la configuración de la nube de Spring Boot .
Simplemente agregue la anotación @RefreshScope en sus beans actualizables y @EnableConfigServer en su main / configuration.
Entonces, por ejemplo, esta clase de Controlador:
@RefreshScope
@RestController
class MessageRestController {
@Value("${message}")
private String message;
@RequestMapping("/message")
String getMessage() {
return this.message;
}
}
Devolverá el nuevo valor de la propiedad String de su message
para el punto final /message
cada vez que se actualice su configuración.
Consulte el ejemplo oficial de la Guía de primavera para la configuración centralizada para obtener más detalles sobre la implementación.