Je souhaite exécuter du code après le démarrage de mon application Spring-Boot pour surveiller les modifications d'un répertoire.
J'ai essayé d'exécuter un nouveau thread mais les @Autowired
services n'ont pas été définis à ce stade.
J'ai pu trouver ApplicationPreparedEvent
ce qui se déclenche avant que les @Autowired
annotations ne soient définies. Idéalement, j'aimerais que l'événement se déclenche une fois que l'application est prête à traiter les demandes http.
Y a-t-il un meilleur événement à utiliser ou une meilleure façon d'exécuter du code après que l'application est en ligne au printemps ?
java
spring
spring-boot
stewsters
la source
la source
Réponses:
Essayer:
la source
@Component
. Voir la réponse de @cjstehno pour le faire fonctionner dans un fichier de guerre.C'est aussi simple que cela:
Testé sur la version
1.5.1.RELEASE
la source
@EventListener(ContextRefreshedEvent.class)
place, ce qui est déclenché après la création du bean, mais avant le démarrage du serveur. Il peut être utilisé pour effectuer des activités avant que toute demande n'atteigne le serveur.ContextRefreshedEvent
, il s'exécutera également après chaque actualisation.Avez-vous essayé ApplicationReadyEvent?
Code depuis: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
Voici ce que la documentation mentionne sur les événements de démarrage:
la source
@EventListener
annotation sur une méthode Bean, en passant comme argument l'événement de classe auquel vous souhaitez vous accrocher.Pourquoi ne pas simplement créer un bean qui démarre votre moniteur lors de l'initialisation, quelque chose comme:
la
init
méthode ne sera pas appelée tant que le câblage automatique n'aura pas été effectué pour le bean.la source
@PostConstruct
trop tôt. Par exemple, lorsque vous utilisez Spring Cloud Stream Kafka, il se@PostConstruct
déclenche avant que l'application ne se lie à Kafka. La solution de Dave Syer est meilleure car elle se déclenche en temps opportun.@PostConstruct
se produit pendant l'initialisation, pas après. Bien que cela puisse être utile dans certains cas, ce n'est pas la bonne réponse si vous souhaitez exécuter après le démarrage de Spring Boot. Par exemple, bien qu'il@PostConstruct
ne se termine pas, aucun des points de terminaison n'est disponible.La méthode "Spring Boot" consiste à utiliser a
CommandLineRunner
. Ajoutez simplement des haricots de ce type et vous êtes prêt à partir. Dans Spring 4.1 (Boot 1.2), il y a aussi unSmartInitializingBean
qui reçoit un rappel après que tout a été initialisé. Et il y en aSmartLifecycle
(à partir du printemps 3).la source
CommandLineRunner
(et du plus récentApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Vous pouvez étendre une classe à l'aide de
ApplicationRunner
, remplacer larun()
méthode et y ajouter le code.la source
ApplicationReadyEvent
n'est vraiment utile que si la tâche que vous souhaitez effectuer n'est pas requise pour un fonctionnement correct du serveur. Le démarrage d'une tâche asynchrone pour surveiller quelque chose pour les changements est un bon exemple.Si, cependant, votre serveur est dans un état `` non prêt '' jusqu'à ce que la tâche soit terminée, il est préférable de l'implémenter
SmartInitializingSingleton
car vous recevrez le rappel avant l' ouverture de votre port REST et votre serveur est ouvert pour les entreprises.Ne soyez pas tenté d'utiliser
@PostConstruct
pour des tâches qui ne devraient se produire qu'une seule fois. Vous aurez une grossière surprise lorsque vous remarquerez qu'il est appelé plusieurs fois ...la source
Avec configuration à ressort:
la source
Utilisez un
SmartInitializingSingleton
haricot au printemps> 4,1Comme alternative, un
CommandLineRunner
bean peut être implémenté ou annoter une méthode de bean avec@PostConstruct
.la source
Voici un exemple de réponse de Dave Syer, qui a fonctionné comme un charme:
la source
Essayez celui-ci et il exécutera votre code lorsque le contexte d'application aura complètement démarré.
la source
J'aime vraiment la suggestion d'utilisation de l'
EventListener
annotation par @cahen ( https://stackoverflow.com/a/44923402/9122660 ) car elle est très propre. Malheureusement, je n'ai pas pu faire fonctionner cela dans une configuration Spring + Kotlin. Ce qui fonctionne pour Kotlin, c'est l'ajout de la classe comme paramètre de méthode:la source
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
La meilleure façon d'exécuter un bloc de code après le démarrage de l'application Spring Boot est d'utiliser l'annotation PostConstruct, ou vous pouvez également utiliser un exécuteur de ligne de commande pour la même chose.
1. Utilisation de l'annotation PostConstruct
2. Utilisation du bean runner de ligne de commande
la source
implémentez simplement CommandLineRunner pour l’application Spring Boot. Vous devez implémenter la méthode d'exécution,
la source
Meilleure façon d'utiliser CommandLineRunner ou ApplicationRunner La seule différence entre la méthode run () est que CommandLineRunner accepte un tableau de chaînes et ApplicationRunner accepte ApplicationArugument.
la source