2015-02-11 7 views
7

मैं वसंत डिफ़ॉल्ट सेट अप करने के लिए spring-boot का उपयोग कर रहा हूं। मैं @EnableScheduling तंत्र का उपयोग करना चाहता हूं, और अपने कार्यों को सशर्त निर्धारित करना चाहता हूं।वसंत-बूट में टास्कशेड्यूलर को कैसे सक्षम करें?

इसलिए मुझे 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

आप एक्सएमएल config के माध्यम से सेटअप अनुसूचक करने की कोशिश की है:

इन परिवर्तनों से आपके कोड कुछ इस तरह की तलाश में छोड़? मेरे लिए मुझे एनोटेशन संचालित कॉन्फ़िगरेशन तरीके से कुछ समस्याएं हैं, लेकिन यह xml कॉन्फ़िगरेशन के साथ चिकनी हो जाती है। – sphinks

+0

क्योंकि यह नहीं करता है। सभी को शेड्यूलर की आवश्यकता नहीं है और पता लगाना वास्तव में संभव नहीं है। तो आपको अपना खुद का जोड़ना होगा। –

+0

यह भी थोड़ा अजीब बात है कि आपकी 'शेड्यूलिंग कॉन्फ़िगरर' एक सेवा है, जो '@ कॉन्फ़िगरेशन' कक्षा होने के लिए अधिक तार्किक होगी। –

उत्तर

8

आप ScheduledTaskRegistrar पर एक अनुसूचक निर्धारित करने की आवश्यकता नहीं है।

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

आप इस डिफ़ॉल्ट अनुसूचक के साथ खुश हैं आप TaskScheduler के अपने autowiring को हटा सकते हैं और कॉल यह स्थापित करने के लिए: एक एक ConcurrentTaskScheduler कि एक एकल पिरोया अनुसूचित निष्पादक लपेटता के लिए यह चूक के लिए कॉन्फ़िगर नहीं किया गया है ScheduledTaskRegistrar पर। इसके अलावा, जैसा कि मार्टन ने टिप्पणियों में सुझाव दिया है, आपको अपनी सेवा के बजाय SchedulingConfigurer कॉन्फ़िगरेशन क्लास बनाना चाहिए।

@Configuration 
static class TaskConfiguration implements SchedulingConfigurer { 

    //schedule the task dynamically 
    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.addTriggerTask(task, trigger); 
    } 
} 
संबंधित मुद्दे