Saya ingin menjalankan kode setelah aplikasi spring-boot saya mulai memantau direktori untuk perubahan.
Saya telah mencoba menjalankan utas baru tetapi @Autowired
layanan belum ditetapkan pada saat itu.
Saya sudah bisa menemukan ApplicationPreparedEvent
, mana yang menyala sebelum @Autowired
anotasi diatur. Idealnya saya ingin acara memecat setelah aplikasi siap untuk memproses permintaan http.
Apakah ada acara yang lebih baik untuk digunakan, atau cara yang lebih baik untuk menjalankan kode setelah aplikasi hidup di musim semi-boot ?
java
spring
spring-boot
pelayan
sumber
sumber
Jawaban:
Mencoba:
sumber
@Component
. Lihat jawaban dari @cjstehno untuk membuatnya berfungsi dalam file perang.Sesederhana ini:
Diuji pada versi
1.5.1.RELEASE
sumber
@EventListener(ContextRefreshedEvent.class)
, yang dipicu setelah pembuatan kacang, tetapi sebelum server dimulai. Itu dapat digunakan untuk melakukan aktivitas sebelum permintaan apapun mengenai server.ContextRefreshedEvent
, itu akan berjalan setelah setiap penyegaran juga.Sudahkah Anda mencoba ApplicationReadyEvent?
Kode dari: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/
Inilah yang disebutkan dalam dokumentasi tentang acara startup:
sumber
@EventListener
anotasi pada metode Bean, dengan argumen sebagai peristiwa kelas yang ingin Anda kaitkan.Mengapa tidak membuat kacang yang memulai monitor Anda saat inisialisasi, seperti:
yang
init
metode tidak akan dipanggil sampai autowiring apapun dilakukan untuk kacang.sumber
@PostConstruct
kebakaran terlalu dini. Misalnya, saat menggunakan Spring Cloud Stream Kafka,@PostConstruct
api sebelum aplikasi berikatan dengan Kafka. Solusi Dave Syer lebih baik karena kebakaran tepat waktu.@PostConstruct
terjadi selama inisialisasi, bukan setelah. Meskipun ini dapat berguna dalam beberapa kasus, itu bukan jawaban yang benar jika Anda ingin menjalankan setelah Boot Spring dimulai. Misalnya, sementara@PostConstruct
tidak selesai, tidak ada titik akhir yang tersedia.Cara "Spring Boot" adalah dengan menggunakan a
CommandLineRunner
. Cukup tambahkan kacang jenis itu dan Anda siap melakukannya. Di Spring 4.1 (Boot 1.2) ada jugaSmartInitializingBean
yang mendapat panggilan balik setelah semuanya diinisialisasi. Dan adaSmartLifecycle
(dari Spring 3).sumber
CommandLineRunner
(dan yang lebih baruApplicationRunner
): docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… .CommandLineRunner
Anda dapat memperluas kelas menggunakan
ApplicationRunner
, menimparun()
metode dan menambahkan kode di sana.sumber
ApplicationReadyEvent
benar-benar hanya berguna jika tugas yang ingin Anda lakukan bukan persyaratan untuk operasi server yang benar. Memulai tugas async untuk memonitor sesuatu untuk perubahan adalah contoh yang baik.Namun, jika server Anda dalam keadaan 'tidak siap' sampai tugas selesai maka lebih baik untuk diterapkan
SmartInitializingSingleton
karena Anda akan mendapatkan panggilan balik sebelum port REST Anda dibuka dan server Anda terbuka untuk bisnis.Jangan tergoda untuk menggunakan
@PostConstruct
tugas yang seharusnya hanya terjadi sekali saja. Anda akan mendapatkan kejutan kasar ketika Anda melihatnya dipanggil beberapa kali ...sumber
Dengan konfigurasi pegas:
sumber
Gunakan
SmartInitializingSingleton
kacang di musim semi> 4.1Sebagai alternatif
CommandLineRunner
kacang dapat diimplementasikan atau menjelaskan metode kacang dengan@PostConstruct
.sumber
Memberikan contoh untuk jawaban Dave Syer, yang bekerja seperti pesona:
sumber
Coba ini dan itu akan menjalankan kode Anda ketika konteks aplikasi sudah sepenuhnya dimulai.
sumber
Saya sangat suka saran untuk penggunaan
EventListener
anotasi oleh @cahen ( https://stackoverflow.com/a/44923402/9122660 ) karena sangat bersih. Sayangnya saya tidak bisa menjalankan ini dalam pengaturan Spring + Kotlin. Apa yang berfungsi untuk Kotlin adalah menambahkan kelas sebagai parameter metode:sumber
@SpringBootApplication class MyApplication { @EventListener(ApplicationReadyEvent::class) fun doSomethingAfterStartup() { println("hello world, I have just started up") } }
Cara terbaik untuk mengeksekusi blok kode setelah aplikasi Boot Spring dimulai adalah menggunakan anotasi PostConstruct. Atau Anda juga dapat menggunakan command line runner untuk hal yang sama.
1. Menggunakan anotasi PostConstruct
2. Menggunakan kacang runner baris perintah
sumber
cukup implementasikan CommandLineRunner untuk aplikasi boot spring. Anda perlu menerapkan metode jalankan,
sumber
Cara terbaik Anda menggunakan CommandLineRunner atau ApplicationRunner Satu-satunya perbedaan antara dijalankan () metode CommandLineRunner menerima array string dan ApplicationRunner menerima ApplicationArugument.
sumber