Rumah > Java > javaTutorial > Bagaimana untuk melaksanakan pemantauan acara permulaan perkhidmatan aplikasi springboot

Bagaimana untuk melaksanakan pemantauan acara permulaan perkhidmatan aplikasi springboot

WBOY
Lepaskan: 2023-05-16 23:10:37
ke hadapan
2191 orang telah melayarinya

    1. Pengenalan

    Spring Boot menyediakan dua antara muka: CommandLineRunner dan ApplicationRunner, yang digunakan untuk melakukan pemprosesan khas apabila memulakan aplikasi digunakan dalam SpringApplication Kaedah run() dilaksanakan sebelum larian selesai. Berbanding dengan pendengar tersuai antara muka ApplicationListener Spring dan pendengar ServletContextListener yang diperkenalkan kepada anda dalam bab sebelumnya. Kelebihan menggunakan kedua-duanya ialah anda boleh menggunakan parameter permulaan aplikasi dengan mudah dan melakukan operasi pemula yang berbeza berdasarkan parameter yang berbeza.

    2. Pengenalan kepada senario biasa

    Laksanakan antara muka CommandLineRunner dan ApplicationRunner. Biasanya digunakan untuk pelaksanaan kod khas sebelum aplikasi bermula, seperti:

    • Muatkan data yang biasa digunakan sistem ke dalam memori

    • Kali terakhir aplikasi menjalankan Pembersihan data sampah

    • Penghantaran pemberitahuan selepas kejayaan sistem dimulakan, dsb.

    Saya melaksanakan antara muka CommandLineRunner dan memuatkan sistem apabila aplikasi dimulakan. Data konfigurasi yang biasa digunakan ditunjukkan dalam rajah di bawah. Muatkan daripada pangkalan data ke dalam memori Apabila menggunakan data pada masa hadapan, anda hanya perlu memanggil kaedah getSysConfigList. Tidak perlu memuatkan data dalam pangkalan data setiap kali. Menjimatkan sumber sistem dan mengurangkan masa memuatkan data.

    Bagaimana untuk melaksanakan pemantauan acara permulaan perkhidmatan aplikasi springboot

    2. Percubaan kod kecil dilaksanakan melalui definisi @Component

    CommandLineRunner: Parameter ialah tatasusunan rentetan

    @Slf4j
    @Component
    public class CommandLineStartupRunner implements CommandLineRunner {
        @Override
        public void run(String... args){
            log.info("CommandLineRunner传入参数:{}", Arrays.toString(args));
        }
    }
    Salin selepas log masuk

    ApplicationRunner: The parameter ialah Letakkannya dalam ApplicationArguments dan dapatkan parameter melalui getOptionNames(), getOptionValues(), getSourceArgs()

    @Slf4j
    @Component
    public class AppStartupRunner implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args)  {
            log.info("ApplicationRunner参数名称: {}", args.getOptionNames());
            log.info("ApplicationRunner参数值: {}", args.getOptionValues("age"));
            log.info("ApplicationRunner参数: {}", Arrays.toString(args.getSourceArgs()));
        }
    }
    Salin selepas log masuk

    Achieve it melalui definisi @Bean

    Kaedah ini boleh menentukan perintah pelaksanaan, bayar perhatian kepada dua Bean pertama ialah CommandLineRunner, dan Bean terakhir ialah ApplicationRunner.

    @Configuration
    public class BeanRunner {
        @Bean
        @Order(1)
        public CommandLineRunner runner1(){
            return new CommandLineRunner() {
                @Override
                public void run(String... args){
                    System.out.println("BeanCommandLineRunner run1()" + Arrays.toString(args));
                }
            };
        }
    
        @Bean
        @Order(2)
        public CommandLineRunner runner2(){
            return new CommandLineRunner() {
                @Override
                public void run(String... args){
                    System.out.println("BeanCommandLineRunner run2()" + Arrays.toString(args));
                }
            };
        }
    
        @Bean
        @Order(3)
        public ApplicationRunner runner3(){
            return new ApplicationRunner() {
                @Override
                public void run(ApplicationArguments args){
                    System.out.println("BeanApplicationRunner run3()" + Arrays.toString(args.getSourceArgs()));
                }
            };
        }
    }
    Salin selepas log masuk

    Anda boleh menetapkan perintah pelaksanaan melalui @Order

    3 Jalankan ujian

    Tambahkan parameter berikut pada konfigurasi permulaan Springboot IDEA, simpan dan mulakan aplikasi<. 🎜>

    Bagaimana untuk melaksanakan pemantauan acara permulaan perkhidmatan aplikasi springboot

    Hasil keluaran ujian:

    c.z.boot.launch.config.AppStartupRunner : Nama parameter ApplicationRunner: [nama, umur]

    c.z.boot .launch.config. AppStartupRunner : Nilai parameter ApplicationRunner: [18]
    c.z.boot.launch.config.AppStartupRunner : Parameter ApplicationRunner: [--name=zimug, --age=18]

    BeanApplicationRunner run3 ()[-- name=zimug, --age=18]

    c.z.b.l.config.CommandLineStartupRunner : Parameter masuk CommandLineRunner: [--name=zimug, --age=18]

    BeanCommandLineRunner run1() [--name =zimug, --age=18]
    e=18]
    BeanCommandLineRunner run2()[--name=zimug, --age=18]

    The penulis telah mengujinya berkali-kali Didapati bahawa dalam keputusan ujian, susunan keutamaan ini sentiasa seperti ini, tetapi pada masa ini tidak jelas sama ada ini adalah norma

    • Keutamaan pelaksanaan ApplicationRunner adalah lebih tinggi daripada CommandLineRunner

    • Keutamaan Runner yang dijalankan dalam bentuk Bean adalah lebih rendah daripada anotasi Komponen plus melaksanakan antara muka Runner

    • Anotasi pesanan hanya boleh menjamin perintah pelaksanaan CommandLineRunner atau ApplicationRunner yang serupa, bukan pesanan terjamin merentas kelas

    4. Ringkasan

    Penggunaan teras CommandLineRunner dan ApplicationRunner adalah konsisten, yang mana adalah untuk melaksanakan kod khas sebelum aplikasi bermula. Perintah pelaksanaan ApplicationRunner mendahului CommandLineRunner; ApplicationRunner merangkum parameter ke dalam objek dan menyediakan kaedah untuk mendapatkan nama parameter, nilai parameter, dll., yang menjadikan operasi lebih mudah.

    5. Ringkasan masalah

    Ini adalah masalah sebenar yang penulis hadapi dalam amalan, iaitu, saya mentakrifkan berbilang pelaksanaan CommandLineRunner. Masalah pelik timbul:

    Apabila anda mentakrifkan berbilang pelaksanaan CommandLineRunner, satu atau beberapa daripadanya tidak akan dilaksanakan.

    Analisis: Kod berikut ialah kod yang SpringBootApplication akan laksanakan selepas memulakan projek Anda boleh melihat bahawa CommandLineRunner atau ApplicationRunner dimulakan melalui traversal dalam kod. Dalam erti kata lain, CommandLineRunner seterusnya akan dilaksanakan hanya selepas pelaksanaan CommandLineRunner sebelumnya selesai, yang dilaksanakan secara serentak.

    private void callRunners(ApplicationContext context, ApplicationArguments args) {
    		List<Object> runners = new ArrayList<>();
    		runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
    		runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
    		AnnotationAwareOrderComparator.sort(runners);
    		for (Object runner : new LinkedHashSet<>(runners)) {
    			if (runner instanceof ApplicationRunner) {
    				callRunner((ApplicationRunner) runner, args);
    			}
    			if (runner instanceof CommandLineRunner) {
    				callRunner((CommandLineRunner) runner, args);
    			}
    		}
    	}
    Salin selepas log masuk
    Jadi, jika API penyekat segerak atau gelung while(true) dipanggil dalam badan kaedah run bagi pelaksanaan CommandLineRunner, pelaksanaan lain selepas CommandLineRunner dalam traversal tidak akan dilaksanakan.

    Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pemantauan acara permulaan perkhidmatan aplikasi springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Label berkaitan:
    sumber:yisu.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan