Memulakan Permohonan Spring Boot secara Program

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menunjukkan bagaimana untuk pengaturcaraan memulakan semula aplikasi Spring Boot .

Memulakan semula aplikasi kami sangat berguna dalam beberapa kes:

  • Memuat semula fail konfigurasi apabila menukar beberapa parameter
  • Mengubah profil yang sedang aktif pada masa runtime
  • Memulakan semula konteks permohonan dengan alasan apa pun

Walaupun artikel ini merangkumi fungsi memulakan semula aplikasi Spring Boot, perhatikan bahawa kami juga mempunyai tutorial hebat tentang mematikan aplikasi Spring Boot.

Sekarang, mari kita terokai pelbagai cara untuk melaksanakan permulaan aplikasi Spring Boot.

2. Mulakan semula dengan Membuat Konteks Baru

Kita boleh memulakan semula aplikasi kita dengan menutup konteks aplikasi dan membuat konteks baru dari awal. Walaupun pendekatan ini cukup mudah, namun ada beberapa perincian yang harus kita berhati-hati untuk membuatnya berfungsi.

Mari lihat bagaimana melaksanakannya dalam kaedah utama aplikasi Spring Boot kami:

@SpringBootApplication public class Application { private static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(Application.class, args); } public static void restart() { ApplicationArguments args = context.getBean(ApplicationArguments.class); Thread thread = new Thread(() -> { context.close(); context = SpringApplication.run(Application.class, args.getSourceArgs()); }); thread.setDaemon(false); thread.start(); } }

Seperti yang dapat kita lihat dalam contoh di atas, penting untuk membuat kembali konteks dalam utas bukan daemon yang terpisah - dengan cara ini kita mencegah penutupan JVM, yang dipicu oleh kaedah tutup , daripada menutup aplikasi kita. Jika tidak, aplikasi kami akan berhenti kerana JVM tidak menunggu benang daemon selesai sebelum menghentikannya.

Selain itu, mari tambah titik akhir REST di mana kita boleh mencetuskan memulakan semula:

@RestController public class RestartController { @PostMapping("/restart") public void restart() { Application.restart(); } }

Di sini, kami telah menambahkan pengawal dengan kaedah pemetaan yang menggunakan kaedah memulakan semula kami .

Kami kemudian boleh memanggil titik akhir baru kami untuk memulakan semula aplikasi:

curl -X POST localhost:port/restart

Sudah tentu, jika kita menambahkan titik akhir seperti ini dalam aplikasi kehidupan nyata, kita juga harus mengamankannya.

3. Titik Akhir Permulaan Penggerak

Cara lain untuk memulakan semula aplikasi kami adalah dengan menggunakan RestartEndpoint terbina dalam dari Spring Boot Actuator.

Pertama, mari tambahkan kebergantungan Maven yang diperlukan:

 org.springframework.boot spring-boot-starter-actuator   org.springframework.boot spring-cloud-starter 

Seterusnya, kita harus mengaktifkan titik akhir restart terbina dalam dalam fail application.properties kami :

management.endpoint.restart.enabled=true

Setelah kita mengatur semuanya, kita dapat memasukkan Restart Endpoint ke dalam perkhidmatan kita:

@Service public class RestartService { @Autowired private RestartEndpoint restartEndpoint; public void restartApp() { restartEndpoint.restart(); } }

Dalam kod di atas, kami menggunakan kacang RestartEndpoint untuk memulakan semula aplikasi kami. Ini adalah kaedah memulakan semula yang baik kerana kita hanya perlu memanggil satu kaedah yang melakukan semua kerja.

Seperti yang kita lihat, menggunakan RestartEndpoint adalah cara mudah untuk memulakan semula aplikasi kita. Di sisi lain, ada kelemahan dengan pendekatan ini kerana ia memerlukan kita menambahkan perpustakaan yang disebutkan. Sekiranya kita belum menggunakannya, ini mungkin terlalu banyak perbelanjaan hanya untuk fungsi ini. Dalam hal ini, kita dapat berpegang pada pendekatan manual dari bahagian sebelumnya kerana hanya memerlukan beberapa baris lagi kod.

4. Menyegarkan Konteks Aplikasi

Dalam beberapa kes, kita dapat memuat kembali konteks aplikasi dengan memanggil kaedah penyegarannya.

Walaupun kaedah ini terdengar menjanjikan, hanya beberapa jenis konteks aplikasi yang mendukung penyegaran konteks yang sudah diinisialisasi. Sebagai contoh, FileSystemXmlApplicationContext , GroovyWebApplicationContext, dan beberapa orang lain menyokongnya.

Malangnya, jika kita mencuba ini dalam aplikasi web Spring Boot, kita akan mendapat ralat berikut:

java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once

Akhirnya, walaupun terdapat beberapa jenis konteks yang menyokong pelbagai penyegaran, kita harus mengelakkannya. Sebabnya adalah bahawa kaedah penyegaran dirancang sebagai kaedah dalaman yang digunakan oleh kerangka untuk menginisialisasi konteks aplikasi.

5. Kesimpulan

Dalam artikel ini, kami meneroka beberapa cara bagaimana memulakan semula aplikasi Spring Boot secara teratur.

Seperti biasa, kita dapat mencari kod sumber untuk contoh di GitHub.