2016-05-23 29 views
14

Voglio eseguire una classe java (che contiene un thread java che voglio eseguire) dopo l'avvio del boot di primavera. Il mio codice iniziale:Avvia thread nell'applicazione Springboot

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

Ed ecco è il codice che voglio da eseguire all'avvio:

public class SimularProfesor implements Runnable{ 

    // Class atributes 

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

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

Come posso chiamare questa discussione? Questo è quello che dovrei fare:

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

Non scherzare con i fili. Crea un 'TaskExecutor' e registra anche la tua classe come bean. Quindi aggiungi un comando 'CommandLineRunner' che prende sia l'attività che il taskExecutor per pianificare l'attività. Hai davvero bisogno di una discussione? –

risposta

19

Non scherzare con i fili da soli. Spring (e anche Java semplice) ha una bella astrazione per questo.

Innanzitutto creare un fagiolo del tipo TaskExecutor nella configurazione

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

quindi creare un CommandLineRunner (anche se un ApplicationListener<ContextRefreshedEvent> sarebbe anche lavorare) per programmare il vostro compito.

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

Ovviamente è possibile effettuare anche la propria classe gestita entro la primavera.

Il vantaggio di questo è che Spring pulirà anche i thread per te e non dovrai pensarci da solo. Ho usato un CommandLineRunner qui perché verrà eseguito dopo l'inizializzazione di tutti i bean.

+1

E se avessimo bisogno di iniettare dipendenze nella classe Runnable? – mapm

+0

@mapm CommandLineRunner è un bean, quindi le dipendenze verranno iniettate come al solito. – user2189998

Problemi correlati