Heim >Java >javaLernprogramm >So implementieren Sie die Überwachung von Startereignissen des Springboot-Anwendungsdienstes

So implementieren Sie die Überwachung von Startereignissen des Springboot-Anwendungsdienstes

WBOY
WBOYnach vorne
2023-05-16 23:10:372200Durchsuche

    1. Einführung

    Spring Boot bietet zwei Schnittstellen: CommandLineRunner und ApplicationRunner, die zum Ausführen einer speziellen Verarbeitung beim Starten der Anwendung verwendet werden, bevor die run()-Methode von SpringApplication abgeschlossen ist. Im Vergleich zum benutzerdefinierten Listener der ApplicationListener-Schnittstelle von Spring und dem ServletContextListener-Listener von Servlet, die Ihnen im vorherigen Kapitel vorgestellt wurden. Der Vorteil beider Verwendung besteht darin, dass Sie problemlos Anwendungsstartparameter verwenden und verschiedene Initialisierungsvorgänge basierend auf unterschiedlichen Parametern durchführen können.

    2. Einführung in gängige Szenarien

    Implementieren Sie die Schnittstellen CommandLineRunner und ApplicationRunner. Wird normalerweise für die Ausführung spezieller Codes vor dem Start der Anwendung verwendet, z. B.:

    • Laden häufig verwendeter Systemdaten in den Speicher

    • Bereinigen von Junk-Daten aus der letzten Ausführung der Anwendung

    • Versenden von Benachrichtigungen nach dem Systemstart erfolgreich usw.

    Ich habe die CommandLineRunner-Schnittstelle implementiert und beim Start der Anwendung die häufig verwendeten Konfigurationsdaten in das System geladen, wie in der folgenden Abbildung dargestellt. Wenn Sie die Daten in Zukunft verwenden, müssen Sie nur die Methode getSysConfigList aufrufen. Es ist nicht erforderlich, die Daten jedes Mal in die Datenbank zu laden. Sparen Sie Systemressourcen und verkürzen Sie die Ladezeit der Daten. 2. Kleines Codeexperiment wird durch die @Component-Definitionsmethode implementiert () und getSourceArgs()

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

    Erreicht durch die @Bean-DefinitionsmethodeSo implementieren Sie die Überwachung von Startereignissen des Springboot-Anwendungsdienstes

    Diese Methode kann die Ausführungsreihenfolge angeben. Beachten Sie, dass die ersten beiden Beans CommandLineRunner und die letzte Bean ApplicationRunner sind.

    @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()));
        }
    }

    Sie können die Ausführungsreihenfolge über @Order festlegen

    3. Führen Sie den Test aus.

    Fügen Sie die folgenden Parameter zur IDEA Springboot-Startkonfiguration hinzu, speichern und starten Sie die Anwendung. Testausgabeergebnisse:

    c.z. boot.launch.config .AppStartupRunner: ApplicationRunner-Parametername: [Name, Alter]

    c.z.boot.launch.config.AppStartupRunner: ApplicationRunner-Parameterwert: [18]

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

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

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

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

    e=18]So implementieren Sie die Überwachung von Startereignissen des Springboot-AnwendungsdienstesBeanCommandLineRunner run2()[--name=zimug, --age=18]

    Nach vielen Tests , stellte der Autor fest, dass diese Prioritätsreihenfolge in den Testergebnissen schon immer so war, aber es ist derzeit unklar, ob dies die Norm ist



    Die Ausführungspriorität von ApplicationRunner ist höher als die von CommandLineRunner

    Die Priorität des Einlaufens von Runner Die Form von Bean ist niedriger als die der Komponentenannotation. Die Art und Weise, wie die Runner-Schnittstelle implementiert wird


    Order-Annotation kann nur die Ausführungsreihenfolge desselben CommandLineRunner oder ApplicationRunner garantieren und kann nicht die Reihenfolge über Klassen hinweg garantieren

      Zusammenfassung
    • Die Kernnutzung von CommandLineRunner und ApplicationRunner ist konsistent, das heißt, sie werden für die Ausführung von Spezialcode vor dem Start der Anwendung verwendet. Die Ausführungsreihenfolge von ApplicationRunner geht CommandLineRunner voraus. ApplicationRunner kapselt Parameter in Objekte und stellt Methoden zum Abrufen von Parameternamen, Parameterwerten usw. bereit, was den Vorgang komfortabler macht.

    • 5. Problemzusammenfassung
    • Dies ist ein echtes Problem, auf das der Autor in der Praxis gestoßen ist, das heißt, ich habe mehrere Implementierungen von CommandLineRunner definiert. Es entsteht ein seltsames Problem:

      Wenn Sie mehrere Implementierungen von CommandLineRunner definieren, werden eine oder mehrere davon nicht ausgeführt.
    • Analyse: Der folgende Code ist der Code, den SpringBootApplication nach dem Starten des Projekts ausführt. Sie können sehen, dass der CommandLineRunner oder ApplicationRunner durch einen Durchlauf im Code gestartet wird. Mit anderen Worten: Der nächste CommandLineRunner wird erst ausgeführt, nachdem die Ausführung des vorherigen CommandLineRunner abgeschlossen ist, der synchron ausgeführt wird.

      @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()));
                  }
              };
          }
      }
    • Wenn also eine synchrone Blockierungs-API oder eine while(true)-Schleife im Ausführungsmethodenkörper einer Implementierung von CommandLineRunner aufgerufen wird, werden andere Implementierungen nach dem CommandLineRunner im Durchlauf nicht ausgeführt.

    Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Überwachung von Startereignissen des Springboot-Anwendungsdienstes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen