440 Stimmen

Führen Sie Code nach dem Starten von Spring Boot aus

Ich möchte Code ausführen, nachdem meine spring-boot App gestartet wurde, um ein Verzeichnis auf Änderungen zu überwachen.

Ich habe versucht, einen neuen Thread auszuführen, aber die @Autowired Services wurden zu diesem Zeitpunkt noch nicht gesetzt.

Ich konnte ApplicationPreparedEvent finden, das vor dem Setzen der @Autowired Annotationen ausgelöst wird. Idealerweise sollte das Ereignis ausgelöst werden, sobald die Anwendung bereit ist, HTTP-Anfragen zu verarbeiten.

Gibt es ein besseres Ereignis, das verwendet werden kann, oder einen besseren Weg, um Code auszuführen, nachdem die Anwendung in spring-boot live ist?

710voto

cahen Punkte 13636

Es ist so einfach wie das:

@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() {
    System.out.println("Hallo Welt, ich bin gerade hochgefahren");
}

Getestet auf Version 1.5.1.RELEASE

157voto

Anton Bessonov Punkte 8498

Versuchen Sie es:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {

    @SuppressWarnings("resource")
    public static void main(final String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        context.getBean(Table.class).fillWithTestdata(); // <-- hier
    }
}

156voto

raspacorp Punkte 4503

Hast du ApplicationReadyEvent ausprobiert?

@Component
public class ApplicationStartup 
implements ApplicationListener {

  /**
   * Dieses Ereignis wird so spät wie möglich ausgeführt, um anzuzeigen, dass die Anwendung bereit ist, Anfragen zu bedienen.
   */
  @Override
  public void onApplicationEvent(final ApplicationReadyEvent event) {

    // hier dein Code ...

    return;
  }
}

Code von: http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/

Das sagt die Dokumentation über die Startereignisse:

...

Die Anwendungsevents werden in folgender Reihenfolge gesendet, während Ihre Anwendung läuft:

Ein ApplicationStartedEvent wird zu Beginn einer Ausführung gesendet, aber vor jeder Verarbeitung außer der Registrierung von Listenern und Initialisierern.

Ein ApplicationEnvironmentPreparedEvent wird gesendet, wenn die Umgebung, die im Kontext verwendet werden soll, bekannt ist, aber bevor der Kontext erstellt wird.

Ein ApplicationPreparedEvent wird direkt vor dem Start der Aktualisierung gesendet, aber nachdem die Bean-Definitionen geladen wurden.

Ein ApplicationReadyEvent wird nachdem die Aktualisierung und eventuelle zugehörige Rückrufe verarbeitet wurden, gesendet, um anzuzeigen, dass die Anwendung bereit ist, Anfragen zu bedienen.

Ein ApplicationFailedEvent wird gesendet, wenn es einen Ausnahmefall beim Start gibt.

...

104voto

cjstehno Punkte 12585

Warum erstellen Sie nicht einfach eine Bean, die Ihren Monitor bei der Initialisierung startet, so etwas wie:

@Component
public class Monitor {
    @Autowired private SomeService service

    @PostConstruct
    public void init(){
        // starten Sie hier Ihr Monitoring
    }
}

Die init-Methode wird erst aufgerufen, wenn die Bean autowired wird.

76voto

Dave Syer Punkte 55898

Der "Spring Boot" -Weg besteht darin, einen CommandLineRunner zu verwenden. Fügen Sie einfach Beans dieses Typs hinzu und Sie sind startklar. In Spring 4.1 (Boot 1.2) gibt es auch einen SmartInitializingBean, der einen Rückruf erhält, nachdem alles initialisiert wurde. Und es gibt SmartLifecycle (ab Spring 3).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X