2016-05-23 14 views
14

Chcę uruchomić klasę java (która zawiera wątek java, który chcę wykonać) po uruchomieniu wiosny. Mój początkowy kod:Rozpocznij wątek w aplikacji springboot

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

A tutaj jest kod Chcę wykonać na początku:

public class SimularProfesor implements Runnable{ 

    // Class atributes 

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

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

Jak mogę nazwać ten wątek? Oto co powinienem zrobić:

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

Nie prowokuj samymi nitkami. Utwórz 'TaskExecutor' i zarejestruj swoją klasę jako komponent bean. Następnie dodaj 'CommandLineRunner', który bierze zarówno zadanie, jak i' TaskExecutor', aby zaplanować zadanie. Czy naprawdę potrzebujesz wątku? –

Odpowiedz

19

Nie rozbijaj samymi nitkami. Wiosna (a także zwykła Java) ma ładną abstrakcję.

Najpierw utwórz fasoli typu TaskExecutor w konfiguracji

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

następnie utworzyć CommandLineRunner (chociaż ApplicationListener<ContextRefreshedEvent> będzie również działać), aby zaplanować swoje zadania.

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

Oczywiście można również zrobić własną klasę na wiosnę.

Zaletą tego jest to, że Spring oczyści również dla Ciebie nici i nie musisz o tym myśleć sam. Użyłem tutaj CommandLineRunner, ponieważ wykona się po tym, jak wszystkie fasole zainicjują komponent bean.

+1

Co zrobić, jeśli musimy wstrzyknąć zależności do klasy Runnable? – mapm

+0

@mapm CommandLineRunner to komponent bean, więc zależności zostaną wprowadzone jak zwykle. – user2189998

Powiązane problemy