Chcę uruchomić kod po tym, jak moja wiosenna aplikacja uruchomi monitorowanie katalogu pod kątem zmian.
Próbowałem uruchomić nowy wątek, ale @Autowired
usługi nie zostały ustawione w tym momencie.
Udało mi się znaleźć ApplicationPreparedEvent
, który odpala przed ustawieniem @Autowired
adnotacji. Idealnie byłoby, gdyby zdarzenie zostało uruchomione, gdy aplikacja będzie gotowa do przetwarzania żądań HTTP.
Czy istnieje lepsze zdarzenie do użycia lub lepszy sposób uruchamiania kodu po uruchomieniu aplikacji w trybie rozruchu wiosennego ?
java
spring
spring-boot
potwory
źródło
źródło
Odpowiedzi:
Próbować:
źródło
@Component
. Zobacz odpowiedź z @cjstehno, aby uzyskać działanie w pliku wojny.Jest to tak proste:
Testowane na wersji
1.5.1.RELEASE
źródło
@EventListener(ContextRefreshedEvent.class)
zamiast tego, który jest uruchamiany po utworzeniu komponentu bean, ale przed uruchomieniem serwera. Można go używać do wykonywania działań, zanim jakiekolwiek żądania trafią na serwer.ContextRefreshedEvent
, będzie działał również po każdym odświeżeniu.Czy próbowałeś ApplicationReadyEvent?
Kod z: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
Oto, co dokumentacja wspomina o zdarzeniach uruchamiania:
źródło
@EventListener
adnotacji w metodzie Bean, przekazując jako argument zdarzenie klasy, do którego chcesz się podłączyć.Dlaczego nie stworzyć fasoli, która uruchamia monitor podczas inicjalizacji, na przykład:
init
metoda nie zostanie wywołana dopóki każdy autowiring odbywa się na fasoli.źródło
@PostConstruct
strzela zbyt wcześnie. Na przykład podczas korzystania z usługi Spring Cloud Stream Kafka@PostConstruct
uruchamia się, zanim aplikacja połączy się z Kafka. Rozwiązanie Dave'a Syera jest lepsze, ponieważ uruchamia się w odpowiednim czasie.@PostConstruct
dzieje się podczas inicjalizacji, a nie później. Chociaż może to być przydatne w niektórych przypadkach, nie jest to poprawna odpowiedź, jeśli chcesz uruchomić po uruchomieniu Spring Boot. Na przykład chociaż@PostConstruct
nie kończy się, żaden z punktów końcowych nie jest dostępny.„Spring Boot” polega na użyciu
CommandLineRunner
. Po prostu dodaj fasolę tego typu i możesz zacząć. W Spring 4.1 (Boot 1.2) jest też taki,SmartInitializingBean
który odbiera oddzwonienie po zainicjowaniu wszystkiego. I jestSmartLifecycle
(od wiosny 3).źródło
CommandLineRunner
(i nowszychApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Możesz rozszerzyć klasę za pomocą
ApplicationRunner
, przesłonićrun()
metodę i dodać tam kod.źródło
ApplicationReadyEvent
jest naprawdę przydatny tylko wtedy, gdy zadanie, które chcesz wykonać, nie jest wymagane do poprawnego działania serwera. Dobrym przykładem jest uruchomienie zadania asynchronicznego w celu monitorowania czegoś pod kątem zmian.Jeśli jednak serwer jest w stanie „niegotowym”, dopóki zadanie nie zostanie zakończone, lepiej go zaimplementować,
SmartInitializingSingleton
ponieważ otrzymasz wywołanie zwrotne przed otwarciem portu REST i otwarciem serwera dla firmy.Nie daj się skusić do
@PostConstruct
wykonywania zadań, które powinny się zdarzyć tylko raz. Otrzymasz niegrzeczną niespodziankę, gdy zauważysz, że jest wywoływana wiele razy ...źródło
W konfiguracji sprężynowej:
źródło
Użyj
SmartInitializingSingleton
fasoli na wiosnę> 4.1Alternatywnie
CommandLineRunner
można zaimplementować fasolę lub dodać do niej metodę fasoli@PostConstruct
.źródło
Podając przykład odpowiedzi Dave'a Syera, która działała jak urok:
źródło
Wypróbuj ten, a uruchomi Twój kod, gdy kontekst aplikacji zostanie w pełni uruchomiony.
źródło
Bardzo podoba mi się sugestia użycia
EventListener
adnotacji przez @cahen ( https://stackoverflow.com/a/44923402/9122660 ), ponieważ jest bardzo czysta. Niestety nie udało mi się uruchomić tego w konfiguracji Spring + Kotlin. To, co działa dla Kotlin, to dodanie klasy jako parametru metody:źródło
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
Najlepszym sposobem na wykonanie bloku kodu po uruchomieniu aplikacji Spring Boot jest skorzystanie z adnotacji PostConstruct lub do tego samego można użyć programu uruchamiającego z wiersza poleceń.
1. Korzystanie z adnotacji PostConstruct
2. Korzystanie z komponentu bean runner z wiersza poleceń
źródło
wystarczy zaimplementować CommandLineRunner dla aplikacji rozruchu wiosennego. Musisz zaimplementować metodę uruchamiania,
źródło
Najlepszy sposób korzystania z CommandLineRunner lub ApplicationRunner Jedyną różnicą jest metoda run () CommandLineRunner akceptuje tablicę ciągów, a ApplicationRunner akceptuje ApplicationArugument.
źródło