स्प्रिंग 3.0 अभिव्यक्ति भाषा के साथ @Scheduled (फिक्स्डडेल) को कैसे परिमाणित किया जाए?


126

किसी निर्धारित कार्य को एनोटेट करने के लिए स्प्रिंग 3.0 क्षमता का उपयोग करते समय, मैं fixedDelayअपने कॉन्फ़िगरेशन फ़ाइल से पैरामीटर के रूप में सेट करना चाहूंगा , बजाय हार्ड-वायरिंग के इसे अपने टास्क क्लास में, वर्तमान में ...

@Scheduled(fixedDelay = 5000)
public void readLog() {
        ...
}

दुर्भाग्य से ऐसा लगता है कि स्प्रिंग एक्सप्रेशन लैंग्वेज (स्पेल) के माध्यम से @Valueएक स्ट्रिंग ऑब्जेक्ट देता है जो बदले में fixedDelayपैरामीटर द्वारा आवश्यक के रूप में लंबे समय तक ऑटो-बॉक्सिंग करने में सक्षम नहीं है ।

जवाबों:


26

मुझे लगता है कि @Scheduledएनोटेशन सवाल से बाहर है। तो शायद आपके लिए एक समाधान task-scheduledXML कॉन्फ़िगरेशन का उपयोग करना होगा । आइए इस उदाहरण पर विचार करें ( स्प्रिंग डॉक्टर से कॉपी ):

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog" 
               fixed-rate="#{YourConfigurationBean.stringValue}"/>
</task:scheduled-tasks>

... या अगर स्ट्रिंग से लांग तक कलाकारों ने काम नहीं किया, तो ऐसा कुछ होगा:

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog"
            fixed-rate="#{T(java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/>
</task:scheduled-tasks>

फिर, मैंने इनमें से किसी भी सेटअप की कोशिश नहीं की है, लेकिन मुझे उम्मीद है कि यह आपकी थोड़ी मदद कर सकता है।


धन्यवाद, XML कॉन्फ़िगरेशन ने चाल चली। मुझे थोड़ा आश्चर्य है कि एनोटेशन स्ट्रिंग मानों के लिए बहुत बाध्य है, वैसे भी, मैं पुराने स्कूल के प्रकार के साथ जाता हूं ;-)
ngeek

1
क्या उपरोक्त विन्यास के लिए कोई जावा समकक्ष है?
amique

@Grzegorz Oledzki <कार्य: अनुसूचित> टैग के तहत "someObject" का मूल्य क्या होगा। यदि किसी नियंत्रक के पास एक से अधिक तरीके हैं, जिन्हें निश्चित देरी और प्रारंभिक देरी की आवश्यकता है, तो इसे कैसे संभाला जाएगा?
मोहित सिंह

423

स्प्रिंग v3.2.2 ने इसे संभालने के लिए मूल 3 लंबे मापदंडों में स्ट्रिंग मापदंडों को जोड़ा है। fixedDelayString, fixedRateStringऔर initialDelayStringअब भी उपलब्ध हैं।

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
public void readLog() {
        ...
}

3
@Avi यह जवाब ओपी के सवाल के तीन साल बाद आया है। प्रश्न के समय (और स्वीकृत उत्तर) यह सुविधा मौजूद नहीं थी।
medveshonok117

@ medveshonok117 मिल गया। धन्यवाद
एवी

51

आप @Scheduledएनोटेशन का उपयोग कर सकते हैं , लेकिन cronकेवल पैरामीटर के साथ :

@Scheduled(cron = "${yourConfiguration.cronExpression}")

आपके 5 सेकंड के अंतराल को व्यक्त किया जा सकता है "*/5 * * * * *"। हालाँकि जैसा कि मैं समझता हूँ कि आप 1 सेकंड से कम समय नहीं दे सकते।


9
क्रॉन अभिव्यक्ति है कि आप से पता चला है fixedRate, जो fixedDelay से अलग है के बराबर है
Codebox

4

स्प्रिंग बूट 2 में, हम @Scheduledएनोटेशन गुणों के लिए स्प्रिंग एक्सप्रेशन लैंग्वेज (SpPL) का उपयोग कर सकते हैं :

@Scheduled(fixedRateString = "${fixed-rate.in.milliseconds}")
public void fixedRate() {
    // do something here
}

@Scheduled(fixedDelayString = "${fixed-delay.in.milliseconds}")
public void fixedDelay() {
    // do something here
}

@Scheduled(cron = "${cron.expression}")
public void cronExpression() {
    // do something here
}

application.propertiesफ़ाइल इस तरह दिखेगा:

fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI

बस। यहां एक लेख है जो कार्य शेड्यूलिंग के बारे में विस्तार से बताता है।


1

मुझे लगता है कि आप एक बीन को परिभाषित करके मूल्य को स्वयं में बदल सकते हैं। मैंने कोशिश नहीं की है , लेकिन मुझे लगता है कि निम्नलिखित के समान दृष्टिकोण आपके लिए उपयोगी हो सकता है:

<bean id="FixedDelayLongValue" class="java.lang.Long"
      factory-method="valueOf">
    <constructor-arg value="#{YourConfigurationBean.stringValue}"/>
</bean>

कहाँ पे:

<bean id="YourConfigurationBean" class="...">
         <property name="stringValue" value="5000"/>
</bean>

धन्यवाद, यह एक तरह से लगता है, लेकिन ईमानदार होने के लिए मैं और अधिक सुरुचिपूर्ण ("बसंत") समाधान की उम्मीद कर रहा था :-)
ngeek

2
दुर्भाग्य से यह काम नहीं करेगा, क्योंकि @ शेड्यूल्ड एनोटेशन विशेषता फिक्स्डले को असाइन करने के लिए एक (लंबे) निरंतर की आवश्यकता होती है।
ngeek

आह, यह सही है। इसलिए मुझे लगता है कि आप @Scheduledएनोटेशन के साथ ऐसा नहीं कर सकते ।
ग्रेजगोरज ओलेदज़की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.