2013-08-23 3 views
43

मैं @Scheduled एनोटेशन का उपयोग करके वसंत में क्रॉन स्टाइल पैटनर्स के साथ निर्धारित नौकरियों को परिभाषित कर रहा हूं।वसंत में अनुसूचित नौकरियों को सशर्त रूप से सक्षम या अक्षम कैसे करें?

क्रॉन पैटर्न कॉन्फ़िगरेशन गुण फ़ाइल में संग्रहीत है। असल में दो गुण फ़ाइलें हैं: एक डिफ़ॉल्ट कॉन्फ़िगरेशन, और एक प्रोफ़ाइल कॉन्फ़िगरेशन जो पर्यावरण निर्भर है (उदा। देव, परीक्षण, प्रोड ग्राहक 1, प्रोड ग्राहक 2 इत्यादि) और कुछ डिफ़ॉल्ट मानों को ओवरराइड करता है।

मैंने अपने वसंत संदर्भ में एक संपत्ति प्लेसहोल्डर बीन कॉन्फ़िगर किया है जो मुझे मेरी संपत्ति फ़ाइलों से मूल्य आयात करने के लिए ${} शैली प्लेसहोल्डर का उपयोग करने की अनुमति देता है।

काम सेम इस तरह दिखता है:

@Component 
public class ImagesPurgeJob implements Job { 

    private Logger logger = Logger.getLogger(this.getClass()); 

    @Override 
    @Transactional(readOnly=true) 
    @Scheduled(cron = "${jobs.mediafiles.imagesPurgeJob.schedule}") 
    public void execute() { 
     //Do something 
      //can use DAO or other autowired beans here 
    } 
} 

मेरी संदर्भ एक्सएमएल के प्रासंगिक भागों:

<!-- Enable configuration of scheduled tasks via annotations --> 
    <task:annotation-driven/> 

<!-- Load configuration files and allow '${}' style placeholders --> 
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:config/default-config.properties</value> 
       <value>classpath:config/environment-config.properties</value> 
      </list> 
     </property> 
     <property name="ignoreUnresolvablePlaceholders" value="true"/> 
     <property name="ignoreResourceNotFound" value="false"/> 
    </bean> 

मैं वास्तव में यह पसंद है। यह न्यूनतम एक्सएमएल के साथ काफी सरल और साफ है।

हालांकि मेरे पास एक और आवश्यकता है: इनमें से कुछ नौकरियों को कुछ मामलों में पूरी तरह से अक्षम किया जा सकता है।

तो, इससे पहले कि मैं उन्हें प्रबंधित करने के स्प्रिंग इस्तेमाल किया मैं उन्हें मैन्युअल रूप से बनाया है और एक बूलियन पैरामीटर अगर नौकरी या सक्षम होने के लिए नहीं है निर्दिष्ट करने के लिए config फाइल में क्रॉन पैरामीटर, के साथ है:

jobs.mediafiles.imagesPurgeJob.enable=true or false 
jobs.mediafiles.imagesPurgeJob.schedule=0 0 0/12 * * ? 

इस कॉन्फ़िगरेशन पैरामीटर के आधार पर, वसंत में सशर्त रूप से बनाने या बस स्पष्ट रूप से बीन को अनदेखा करने के लिए मैं इस पैरामीटर का उपयोग कैसे कर सकता हूं?

एक स्पष्ट कामकाज एक क्रॉन पैटर्न को परिभाषित करना होगा जो कभी मूल्यांकन नहीं करेगा, इसलिए नौकरी कभी निष्पादित नहीं होती है। लेकिन बीन अभी भी बनाया जाएगा और कॉन्फ़िगर थोड़ा अस्पष्ट होगा, इसलिए मुझे लगता है कि एक बेहतर समाधान होना चाहिए।

कोई विचार?

+0

आप कभी भी इस के लिए एक जवाब मिला? – Chaos

+1

@Cos: नहीं, अभी भी इसके लिए अतिरिक्त बुलियन संपत्ति का उपयोग कर। –

+0

"एक क्रॉन पैटर्न जो कभी मूल्यांकन नहीं करेगा" यह काम नहीं करता है, वसंत शेड्यूलर कोड को वैध "अगली रन डेट" की आवश्यकता होती है अन्यथा यह अपवाद फेंकता है। (सभी संस्करणों के लिए सच नहीं हो सकता है) –

उत्तर

24
@Component 
public class ImagesPurgeJob implements Job { 

    private Logger logger = Logger.getLogger(this.getClass()); 

    @Value("${jobs.mediafiles.imagesPurgeJob.enable}") 
    private boolean imagesPurgeJobEnable; 

    @Override 
    @Transactional(readOnly=true) 
    @Scheduled(cron = "${jobs.mediafiles.imagesPurgeJob.schedule}") 
    public void execute() { 

     //Do something 
     //can use DAO or other autowired beans here 
     if(imagesPurgeJobEnable){ 

      Do your conditional job here... 

     } 
    } 
} 
+8

धन्यवाद, यह एक विकल्प है, लेकिन मैं बीन बनाने के अलावा बीन को तुरंत चालू नहीं करना चाहता हूं और समय-समय पर एक विधि निष्पादित करता हूं, भले ही यह कुछ भी नहीं करता है। –

+0

मैंने इसे इस तरह कार्यान्वित करना समाप्त कर दिया, क्योंकि यह आसान था हालांकि सही नहीं था। और मैंने @ वैल्यू एनोटेशन के बारे में सीखा जो अच्छा है। –

+0

सुनने के लिए ग्लैड। धन्यवाद ... – Prabhakaran

2

आपका प्रश्न बीन की वास्तविक रचना को हालत में बताता है। यदि आप कम से कम स्प्रिंग 3.1 का उपयोग कर रहे हैं तो आप @Profile का उपयोग कर इस पैरामीटर के साथ आसानी से ऐसा कर सकते हैं। http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/Profile.html

+0

जबकि प्रोफाइल एक साधारण देव/प्रोड वातावरण सेट में ठीक होंगे, मुझे लगता है कि वे वास्तव में कई उत्पादन वातावरण (जैसे विभिन्न ग्राहकों के साथ चालू/बंद स्विच के साथ) में अनुकूलित नहीं हैं और हमारे मौजूदा कॉन्फ़िगरेशन प्रबंधन के आधार पर अच्छी तरह से मिश्रण नहीं करेंगे सक्रिय प्रोफाइल की संपत्ति फ़ाइलों और मेवेन बिल्ड-टाइम चयन पर। अभी सभी पर्यावरण-निर्भर पैरामीटर एक एकल गुण फ़ाइल में केंद्रीकृत हैं। स्प्रिंग कॉन्फ़िगरेशन सभी के लिए समान है। अगर हम वसंत प्रोफाइल का उपयोग करते हैं तो यह मामला नहीं होगा। –

+0

आप एक कस्टम प्रारंभकर्ता में वसंत प्रोफाइल को सशर्त रूप से सक्रिय कर सकते हैं (उदाहरण के लिए ApplicationContextInitializer को विस्तारित करके और इसे अपने web.xml में जोड़कर)। फिर अपने प्रारंभकर्ता में, आप पर्यावरण सेटिंग्स प्राप्त कर सकते हैं और संपत्ति सेटिंग्स के आधार पर प्रोफ़ाइल सक्रिय कर सकते हैं, उदाहरण के लिए। स्ट्रिंग ध्वज = पर्यावरण .getProperty ("my.custom.property"); अगर ("सत्य" .equals (ध्वज)) {environment.activateProfile ("MY_CUSTOM_PROFILE")}। हम विभिन्न ग्राहक वातावरण में विभिन्न सुविधाओं के लिए इसका बहुत उपयोग करते हैं, और परीक्षणों के लिए कुछ विशेषताओं को सक्षम/अक्षम करने के लिए भी उपयोग करते हैं (उदाहरण के लिए शून्य-डीपी सेवा सक्षम करें)। – jugglingcats

16

स्प्रिंग बूट @ConditionalOnProperty प्रदान करता है, जो सही होगा यदि आप वसंत बूट का उपयोग किया जा:

दस्तावेज़ यहां देखें। यह एनोटेशन @Conditional का एक विशेषज्ञता है, जिसे स्प्रिंग 4.0.0 के साथ पेश किया गया है।

मान लें कि आप बस "नियमित" वसंत का उपयोग कर रहे हैं और स्प्रिंग बूट नहीं, आप @ कंडिशन के साथ उपयोग के लिए अपना खुद का कंडीशन कार्यान्वयन बना सकते हैं जो स्प्रिंग बूट की @ कंडिशनऑनप्रोपर्टी की नकल करेगा।

+0

आदर्श रूप से यह काम करना चाहिए, लेकिन यह मेरे मामले के लिए 1.3.2-स्प्रिंग बूट के रिलीज के साथ नहीं है। – dARKpRINCE

+0

स्प्रिंगबूट 1.4.0 – ETL

+0

में @ConditionalOnProperty के साथ ऐसा करने में भी सक्षम नहीं था '@ सशर्त 'दस्तावेज़ों के अनुसार, एनोटेशन केवल' @ बीन', यानी एनोटेटेड विधियों के लिए विधि स्तर पर लागू होता है। एक बीन परिभाषा। – jordanpg

14

आप सेवाओं की संख्या में परिस्थितियों से समूह अनुसूची के तरीकों और इस तरह से उन्हें init कर सकते हैं:

@Service 
@ConditionalOnProperty("yourConditionPropery") 
public class SchedulingService { 

@Scheduled 
public void task1() {...} 

@Scheduled 
public void task2() {...} 

} 
0
@Component 
public class CurrencySyncServiceImpl implements CurrencySyncService { 

    private static Boolean isEnableSync; 
    /** 
    * Currency Sync FixedDelay in minutes 
    */ 
    private static Integer fixedDelay; 

    @Transactional 
    @Override 
    @Scheduled(fixedDelayString = "#{${currency.sync.fixedDelay}*60*1000}") 
    public void sync() { 
     if(CurrencySyncServiceImpl.isEnableSync) { 
      //Do something 
      //you can use DAO or other autowired beans here. 
     } 
    } 

    @Value("${currency.sync.fixedDelay}") 
    public void setFixedDelay(Integer fixedDelay) { 
     CurrencySyncServiceImpl.fixedDelay = fixedDelay; 
    } 

    @Value("${currency.sync.isEnable}") 
    public void setIsEnableSync(Boolean isEnableSync) { 
     CurrencySyncServiceImpl.isEnableSync = isEnableSync; 
    } 
} 
संबंधित मुद्दे