Quiero ejecutar el código después de que mi aplicación spring-boot comience a monitorear un directorio en busca de cambios.
He intentado ejecutar un nuevo hilo pero los @Autowired
servicios no se han establecido en ese punto.
He podido encontrar ApplicationPreparedEvent
, que se dispara antes de que @Autowired
se establezcan las anotaciones. Idealmente, me gustaría que el evento se active una vez que la aplicación esté lista para procesar solicitudes http.
¿Hay un mejor evento para usar, o una mejor manera de ejecutar el código después de que la aplicación esté activa en spring-boot ?
java
spring
spring-boot
guisados
fuente
fuente
Respuestas:
Tratar:
fuente
@Component
. Vea la respuesta de @cjstehno para que funcione en un archivo de guerra.Es tan simple como esto:
Probado en la versión
1.5.1.RELEASE
fuente
@EventListener(ContextRefreshedEvent.class)
, que se activa después de la creación del bean, pero antes de que se inicie el servidor. Se puede usar para realizar actividades antes de que cualquier solicitud llegue al servidor.ContextRefreshedEvent
, también se ejecutará después de cada actualización.¿Has probado ApplicationReadyEvent?
Código de: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
Esto es lo que menciona la documentación sobre los eventos de inicio:
fuente
@EventListener
anotaciones en un método Bean, pasando como argumento el evento de clase al que desea conectarse.¿Por qué no simplemente crear un bean que inicia su monitor en la inicialización, algo como:
el
init
método no se llamará hasta que se realice un cableado automático para el bean.fuente
@PostConstruct
dispara demasiado temprano. Por ejemplo, cuando se usa Spring Cloud Stream Kafka, se@PostConstruct
dispara antes de que la aplicación se una a Kafka. La solución de Dave Syer es mejor porque se dispara a tiempo.@PostConstruct
sucede durante la inicialización, no después. Aunque esto puede ser útil en algunos casos, no es la respuesta correcta si desea ejecutar después del inicio de Spring Boot. Por ejemplo, mientras@PostConstruct
no termina, ninguno de los puntos finales está disponible.La forma de "Spring Boot" es usar a
CommandLineRunner
. Solo agregue frijoles de ese tipo y estará listo. En Spring 4.1 (Boot 1.2) también hay unSmartInitializingBean
que recibe una devolución de llamada después de que todo se haya inicializado. Y la haySmartLifecycle
(desde la primavera 3).fuente
CommandLineRunner
(y el más recienteApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Puede extender una clase usando
ApplicationRunner
, anular elrun()
método y agregar el código allí.fuente
ApplicationReadyEvent
en realidad solo es útil si la tarea que desea realizar no es un requisito para el correcto funcionamiento del servidor. Iniciar una tarea asincrónica para monitorear algo en busca de cambios es un buen ejemplo.Sin embargo, si su servidor está en un estado 'no listo' hasta que se complete la tarea, entonces es mejor implementarlo
SmartInitializingSingleton
porque recibirá la devolución de llamada antes de que su puerto REST se haya abierto y su servidor esté abierto para los negocios.No caigas en la tentación de utilizarlo
@PostConstruct
para tareas que solo deberían ocurrir una vez. Obtendrá una sorpresa grosera cuando note que se llama varias veces ...fuente
Con configuración de resorte:
fuente
Usa un
SmartInitializingSingleton
frijol en primavera> 4.1Como alternativa,
CommandLineRunner
se puede implementar un bean o anotar un método de bean con@PostConstruct
.fuente
Proporcionando un ejemplo para la respuesta de Dave Syer, que funcionó a las mil maravillas:
fuente
Pruebe este y ejecutará su código cuando el contexto de la aplicación se haya iniciado por completo.
fuente
Realmente me gusta la sugerencia para el uso de la
EventListener
anotación por @cahen ( https://stackoverflow.com/a/44923402/9122660 ) ya que está muy limpia. Lamentablemente, no pude hacer que esto funcionara en una configuración Spring + Kotlin. Lo que sí funciona para Kotlin es agregar la clase como parámetro de método:fuente
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
La mejor manera de ejecutar el bloque de código después de que se inicie la aplicación Spring Boot es usar la anotación PostConstruct, o también puede usar el corredor de línea de comando para el mismo.
1. Usando la anotación PostConstruct
2. Usando la línea de comando bean runner
fuente
simplemente implemente CommandLineRunner para la aplicación de arranque de primavera. Necesita implementar el método de ejecución,
fuente
La mejor manera de usar CommandLineRunner o ApplicationRunner La única diferencia entre el método run () CommandLineRunner acepta una matriz de cadenas y ApplicationRunner acepta ApplicationArugument.
fuente