2015-02-11 12 views
7

Używam spring-boot do konfigurowania ustawień domyślnych sprężyn. Chciałbym użyć mechanizmu @EnableScheduling i zaplanować moje zadania warunkowo.Jak włączyć TaskScheduler w wiosennym rozruchu?

Dlatego muszę zaimplementować SchedulingConfigurer i ustawić jawnie TaskScheduler.

Ale po wstrzyknięciu TaskScheduler pojawia się następujący błąd. Ale dlaczego Spring-Boot automatycznie nie udostępnia Harmonogramu?

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

Błąd:

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

Czy próbuje ustawić planującego za pośrednictwem xml config? Jeśli chodzi o mnie, mam pewne problemy z konfiguracją opartą na adnotacji, ale idzie gładko z konfiguracją xml. – sphinks

+0

Ponieważ tak nie jest. Nie każdy potrzebuje harmonogramu, a wykrywanie nie jest możliwe. Więc musisz dodać własne. –

+0

Również jest trochę dziwne, że twój 'SchedulingConfigurer' jest usługą, byłoby bardziej logiczne być klasą' @ Configuration'. –

Odpowiedz

8

Nie trzeba ustawić harmonogram na ScheduledTaskRegistrar. Jeśli ktoś nie został skonfigurowany domyślnie go do ConcurrentTaskScheduler że owija jednowątkowych zaplanowane wykonawcę:

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

jeśli jesteś zadowolony z tego domyślnego planisty można usunąć swój autowiring z TaskScheduler i wywołanie go ustawić na urządzeniu ScheduledTaskRegistrar. Ponadto, jak zasugerował Marten w komentarzach, powinieneś uczynić swoją SchedulingConfigurer klasą konfiguracji, a nie usługą.

Zmiany te zostawić swój kod poszukuje coś takiego:

@Configuration 
static class TaskConfiguration implements SchedulingConfigurer { 

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