2015-02-11 2 views
7

Я использую spring-boot для настройки весенних настроек по умолчанию. Я хотел бы использовать механизм @EnableScheduling и запланировать выполнение моих задач условно.Как включить TaskScheduler в spring-boot?

Поэтому я должен реализовать SchedulingConfigurer и установить TaskScheduler явно.

Но при вводе TaskScheduler возникает следующая ошибка. Но почему весенняя загрузка автоматически не предусматривает Планировщика соответственно?

@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); 
    } 
} 

Ошибка:

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

Вы пытаетесь настройки планировщика с помощью XML-конфигурации? Что касается меня, у меня есть некоторые проблемы с конфигурацией, основанной на аннотациях, но она идет гладко с xml config. – sphinks

+0

Потому что это не так. Не каждый нуждается в планировщике, и обнаружение на самом деле невозможно. Таким образом, вы должны добавить свой собственный. –

+0

Также немного странно, что ваш 'SchedulingConfigurer' является сервисом, более логичным будет класс' @ Configuration'. –

ответ

8

Вам не нужно, чтобы установить планировщик на ScheduledTaskRegistrar. Если один не были настроено, то по умолчанию в ConcurrentTaskScheduler, который оборачивает однопоточный запланированный исполнитель:

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

Если вы счастливы с этим по умолчанию планировщика вы можете удалить свое автоматическое связывание из TaskScheduler и вызова, чтобы установить его на ScheduledTaskRegistrar. Кроме того, как предложил Мартен в комментариях, вы должны сделать свой SchedulingConfigurer конфигурационным классом, а не сервисом.

Эти изменения оставить ваш код выглядеть примерно так:

@Configuration 
static class TaskConfiguration implements SchedulingConfigurer { 

    //schedule the task dynamically 
    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.addTriggerTask(task, trigger); 
    } 
} 
Смежные вопросы