2015-02-11 14 views
7

Sto utilizzando spring-boot per impostare i valori predefiniti di primavera. Mi piacerebbe utilizzare il meccanismo @EnableScheduling e pianificare le mie attività in modo condizionale.Come abilitare TaskScheduler in spring-boot?

Pertanto, devo implementare SchedulingConfigurer e impostare TaskScheduler esplicito.

Tuttavia, durante l'iniezione di TaskScheduler, viene visualizzato il seguente errore. Ma perché spring-boot non fornisce automaticamente uno Scheduler di conseguenza?

@Configuration 
@EnableAutoConfiguration 
@EnableScheduling 
public class AppConfig { 

} 

@Service 
public class JobService implements SchedulingConfigurer { 
    @Autowired 
    private TaskScheduler taskScheduler; 

    //schedule the task dynamically 
    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.setScheduler(taskScheduler); //fails 
     taskRegistrar.addTriggerTask(task, trigger); 
    } 
} 

Errore:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.scheduling.TaskScheduler; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.TaskScheduler] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 15 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.TaskScheduler] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    ... 17 more 
+1

Avete cercare di configurazione scheduler tramite XML di configurazione? Per quanto mi riguarda, ho alcuni problemi con il modo di configurazione guidato dall'annotazione, ma va liscio con la configurazione xml. – sphinks

+0

Perché non è così. Non tutti hanno bisogno di un programmatore e il rilevamento non è realmente possibile. Quindi dovrai aggiungere il tuo. –

+0

Inoltre è un po 'strano che il tuo 'SchedulingConfigurer' sia un servizio, sarebbe più logico essere una classe' @ Configuration'. –

risposta

8

Non è necessario impostare uno scheduler sul ScheduledTaskRegistrar. Se uno non è stato configurato il default a un ConcurrentTaskScheduler che avvolge un thread singolo esecutore in programma:

if (this.taskScheduler == null) { 
    this.localExecutor = Executors.newSingleThreadScheduledExecutor(); 
    this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); 
} 

Se sei soddisfatto di questo scheduler di default è possibile rimuovere le autowiring del TaskScheduler e la chiamata per impostarlo su ScheduledTaskRegistrar. Inoltre, come suggerito da Marten nei commenti, dovresti rendere la tua SchedulingConfigurer una classe di configurazione piuttosto che un servizio.

Questi cambiamenti lasciare il codice cercando qualcosa di simile:

@Configuration 
static class TaskConfiguration implements SchedulingConfigurer { 

    //schedule the task dynamically 
    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.addTriggerTask(task, trigger); 
    } 
}