2015-02-11 16 views
7

Bahar varsayılan kurmak spring-boot kullanıyorum. Ben @EnableScheduling mekanizmasını kullanın ve koşullu benim görevleri planlamak istiyorum.İlkbahar-önyüklemede TaskScheduler nasıl etkinleştirilir?

Bu nedenle SchedulingConfigurer uygulamak ve TaskScheduler açık ayarlamanız gerekir. TaskScheduler enjekte ederken

Ama şu hatayı alıyorum. Ancak, ilkbahar-önyükleme neden otomatik olarak bir Zamanlayıcı sağlamaz?

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

Hata: ScheduledTaskRegistrar üzerine bir zamanlayıcı ayarlamak gerekmez

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

Eğer xml yapılandırma yoluyla kurulum zamanlayıcı denemek mü:

Bu değişiklikler kod aşağıdaki gibi görünen ayrıldım mı? Benim açımdan, açıklama ekli konfigürasyon yolunda bazı problemlerim var, ama xml config ile sorunsuz gidiyor. – sphinks

+0

Çünkü değil. Herkesin bir programlayıcıya ihtiyacı yoktur ve tespit etmek gerçekten mümkün değildir. Yani kendiniz eklemek zorundasınız. –

+0

Ayrıca senin 'SchedulingConfigurer' bir hizmettir, bir' @ Configuration' sınıf olması daha mantıklı olacağını biraz garip. –

cevap

8

. Bu varsayılan zamanlayıcı ile mutluysan

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

Eğer TaskScheduler sizin Autowiring kaldırabilir ve ayarlamak için çağrı: Bir tek iş parçacıklı planlanan vasisi sarar bir ConcurrentTaskScheduler için varsayılan olarak yapılandırılmış değilse ScheduledTaskRegistrar'da. Marten en Yorum önerilen olarak da, sizin SchedulingConfigurer bir yapılandırma sınıfı yerine bir servis yapmalıdır.

@Configuration 
static class TaskConfiguration implements SchedulingConfigurer { 

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