web-dev-qa-db-fra.com

Démarrer le fil à l'application Spring Boot

Je veux exécuter une classe Java (qui contient un Java que je veux exécuter) après le démarrage du printemps. Mon code initial:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Et voici le code que je veux exécuter au démarrage:

public class SimularProfesor implements Runnable{

    // Class atributes

    // Constructor
    public SimularProfesor() {
        //Initialization of atributes
    }

    @Override
    public void run() {
        while(true) {
            // Do something
        }
    }
}

Comment puis-je appeler ce fil? Voici ce que je suis censé faire:

@SpringBootApplication
public class Application {
     public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        // Call thread (constructor must be executed too)
     }
}
27
user6159261

Ne jouez pas avec les fils vous-même. Spring (et aussi Java simple) a une belle abstraction pour cela.

Créez d'abord un bean du type TaskExecutor dans votre configuration

@Bean
public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor(); // Or use another one of your liking
}

Créez ensuite un CommandLineRunner (bien qu'un ApplicationListener<ContextRefreshedEvent> fonctionnerait également) pour planifier votre tâche.

@Bean
public CommandLineRunner schedulingRunner(TaskExecutor executor) {
    return new CommandLineRunner() {
        public void run(String... args) throws Exception {
            executor.execute(new SimularProfesor());
        }
    }
}

Vous pouvez bien sûr également créer votre propre classe gérée au printemps.

L'avantage de cela est que Spring nettoiera également les fils pour vous et vous n'avez pas à y penser vous-même. J'ai utilisé un CommandLineRunner ici car cela s'exécutera après que tous les beans auront initialisé le bean.

34
M. Deinum