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?

54voto

Andy Brown Punkte 10191

ApplicationReadyEvent ist wirklich nur nützlich, wenn die Aufgabe, die Sie ausführen möchten, keine Anforderung für den korrekten Betrieb des Servers ist. Das Starten einer asynchronen Aufgabe, um etwas auf Änderungen zu überwachen, ist ein gutes Beispiel.

Wenn jedoch Ihr Server in einem 'nicht bereit' Zustand ist, bis die Aufgabe abgeschlossen ist, ist es besser, SmartInitializingSingleton zu implementieren, weil Sie den Rückruf bevor Ihr REST-Port geöffnet wurde und Ihr Server für Geschäfte geöffnet ist.

Lassen Sie sich nicht dazu verleiten, @PostConstruct für Aufgaben zu verwenden, die nur einmalig ausgeführt werden sollen. Sie werden eine unangenehme Überraschung erleben, wenn Sie feststellen, dass es mehrmals aufgerufen wird...

44voto

Gimhani Punkte 1138

Sie können eine Klasse erweitern, indem Sie ApplicationRunner verwenden, die run()-Methode überschreiben und den Code dort hinzufügen.

import org.springframework.boot.ApplicationRunner;

@Component
public class ServerInitializer implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {

        //Der Code wird hier eingefügt

    }
}

16voto

Naresh Bhadke Punkte 303

Der beste Weg, einen Codeblock nach dem Starten der Spring Boot-Anwendung auszuführen, besteht darin, die PostConstruct-Annotation zu verwenden. Alternativ können Sie auch einen Befehlszeilen-Ausführer für dasselbe verwenden.

1. Verwendung der PostConstruct-Annotation

@Configuration
public class InitialDataConfiguration {

    @PostConstruct
    public void postConstruct() {
        System.out.println("Gestartet nach der Spring Boot-Anwendung!");
    }

}

2. Verwendung des Befehlszeilen-Ausführungsbeans

@Configuration
public class InitialDataConfiguration {

    @Bean
    CommandLineRunner runner() {
        return args -> {
            System.out.println("CommandLineRunner läuft in der UnsplashApplication-Klasse...");
        };
    }
}

15voto

Jeff Punkte 1806

Verwenden Sie ein SmartInitializingSingleton-Bean in Spring > 4.1

@Bean
public SmartInitializingSingleton importProcessor() {
    return () -> {
        doStuff();
    };

}

Alternativ kann ein CommandLineRunner-Bean implementiert werden oder eine Bean-Methode mit @PostConstruct annotiert werden.

14voto

Paulo Pedroso Punkte 3307

Bereitstellung eines Beispiels für die Antwort von Dave Syer, die wie ein Zauber funktionierte:

@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
    private static final Logger logger = LoggerFactory.getLogger(CommandLineAppStartupRunner.class);

    @Override
    public void run(String...args) throws Exception {
        logger.info("Anwendung wurde mit Befehlszeilenargumenten gestartet: {} . \n Um diese Anwendung zu beenden, drücken Sie Strg + C.", Arrays.toString(args));
    }
}

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