Ich möchte Code ausführen, nachdem meine Spring-Boot- App ein Verzeichnis auf Änderungen überwacht.
Ich habe versucht, einen neuen Thread auszuführen, aber die @Autowired
Dienste wurden zu diesem Zeitpunkt noch nicht festgelegt.
Ich konnte herausfinden ApplicationPreparedEvent
, welche Brände @Autowired
ausgelöst werden, bevor die Anmerkungen gesetzt werden. Idealerweise möchte ich, dass das Ereignis ausgelöst wird, sobald die Anwendung bereit ist, http-Anforderungen zu verarbeiten.
Gibt es ein besseres Ereignis oder eine bessere Möglichkeit, Code auszuführen, nachdem die Anwendung im Spring-Boot live ist ?
java
spring
spring-boot
Eintöpfe
quelle
quelle
Antworten:
Versuchen:
quelle
@Component
. Siehe Antwort von @cjstehno, damit es in einer Kriegsdatei funktioniert.So einfach ist das:
Auf Version getestet
1.5.1.RELEASE
quelle
@EventListener(ContextRefreshedEvent.class)
stattdessen stattdessen verwenden, was nach der Bean-Erstellung, jedoch vor dem Start des Servers ausgelöst wird. Es kann verwendet werden, um Aktivitäten auszuführen, bevor Anforderungen den Server erreichen.ContextRefreshedEvent
, wird es auch nach jeder Aktualisierung ausgeführt.Haben Sie ApplicationReadyEvent ausprobiert?
Code von: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
In der Dokumentation wird Folgendes zu den Startereignissen erwähnt:
quelle
@EventListener
Anmerkungen zu einer Bean-Methode tun und das Klassenereignis, an das Sie sich anschließen möchten, als Argument übergeben.Warum erstellen Sie nicht einfach eine Bean, die Ihren Monitor bei der Initialisierung startet?
Die
init
Methode wird erst aufgerufen, wenn für die Bean eine automatische Verdrahtung durchgeführt wurde.quelle
@PostConstruct
zu früh. Wenn Sie beispielsweise Spring Cloud Stream Kafka verwenden, wird dies@PostConstruct
ausgelöst, bevor die Anwendung an Kafka gebunden wird. Die Lösung von Dave Syer ist besser, weil sie rechtzeitig ausgelöst wird.@PostConstruct
geschieht während der Initialisierung, nicht danach. Obwohl dies in einigen Fällen nützlich sein kann, ist es nicht die richtige Antwort, wenn Sie nach dem Start von Spring Boot ausgeführt werden möchten . Beispielsweise ist@PostConstruct
keiner der Endpunkte verfügbar , obwohl er nicht fertig ist.Der "Spring Boot" Weg ist die Verwendung von a
CommandLineRunner
. Fügen Sie einfach Bohnen dieser Art hinzu und schon kann es losgehen. In Spring 4.1 (Boot 1.2) gibt es auch einen,SmartInitializingBean
der einen Rückruf erhält, nachdem alles initialisiert wurde. Und das gibt esSmartLifecycle
(ab Frühling 3).quelle
CommandLineRunner
(und des neuerenApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Sie können eine Klasse mit erweitern
ApplicationRunner
, dierun()
Methode überschreiben und dort den Code hinzufügen.quelle
ApplicationReadyEvent
ist wirklich nur dann nützlich, wenn die Aufgabe, die Sie ausführen möchten, keine Voraussetzung für einen korrekten Serverbetrieb ist. Ein gutes Beispiel ist das Starten einer asynchronen Aufgabe, um etwas auf Änderungen zu überwachen.Wenn sich Ihr Server jedoch bis zum Abschluss der Aufgabe in einem Status "Nicht bereit" befindet, ist es besser, ihn zu implementieren,
SmartInitializingSingleton
da Sie den Rückruf erhalten, bevor Ihr REST-Port geöffnet wurde und Ihr Server für den Geschäftsbetrieb geöffnet ist.Seien Sie nicht versucht,
@PostConstruct
Aufgaben zu verwenden, die nur einmal ausgeführt werden sollten. Sie werden eine grobe Überraschung bekommen, wenn Sie bemerken, dass es mehrmals aufgerufen wird ...quelle
Mit Federkonfiguration:
quelle
Verwenden Sie
SmartInitializingSingleton
im Frühjahr eine Bohne> 4.1Alternativ kann eine
CommandLineRunner
Bean implementiert oder eine Bean-Methode mit kommentiert werden@PostConstruct
.quelle
Ein Beispiel für die Antwort von Dave Syer, die wie ein Zauber wirkte:
quelle
Versuchen Sie dies und es wird Ihr Code ausgeführt, wenn der Anwendungskontext vollständig gestartet wurde.
quelle
Ich mag den Vorschlag für die Verwendung der
EventListener
Anmerkung von @cahen ( https://stackoverflow.com/a/44923402/9122660 ) sehr, da sie sehr sauber ist. Leider konnte ich dies in einem Spring + Kotlin-Setup nicht zum Laufen bringen. Für Kotlin funktioniert das Hinzufügen der Klasse als Methodenparameter:quelle
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
Der beste Weg, um einen Codeblock nach dem Start der Spring Boot-Anwendung auszuführen, ist die Verwendung der PostConstruct-Annotation. Oder Sie können auch den Befehlszeilen-Runner für dieselbe verwenden.
1. Verwenden der PostConstruct-Annotation
2. Verwenden der Befehlszeilen-Runner-Bean
quelle
Implementieren Sie einfach CommandLineRunner für die Spring-Boot-Anwendung. Sie müssen die Ausführungsmethode implementieren.
quelle
Beste Verwendung von CommandLineRunner oder ApplicationRunner Der einzige Unterschied zwischen der run () -Methode CommandLineRunner akzeptiert ein Array von Zeichenfolgen und ApplicationRunner akzeptiert ApplicationArugument.
quelle