2010-08-25 13 views
15

का उपयोग करके एक बार चलाने के लिए शेड्यूलिंग कार्य, मैं कार्य नामस्थान का उपयोग करके वसंत में अनुसूचित कार्य योजना सेट अप कर रहा हूं।स्प्रिंग कार्य नेमस्पेस

मैं एक क्रॉन अभिव्यक्ति के अनुसार आग सबसे कार्य शेड्यूल करना चाहते हैं, और कुछ स्टार्टअप के बाद सिर्फ एक बार एक निश्चित देरी आग,, और उसके बाद फिर कभी नहीं (अर्थात क्या एक SimpleTriggerBean पर 0 को repeatCount की स्थापना को प्राप्त होगा)।

क्या यह कार्य नेमस्पेस के भीतर इसे हासिल करना संभव है, या क्या मुझे अपने ट्रिगर्स के लिए बीन्स को परिभाषित करने की आवश्यकता है?

उत्तर

7

आप Task namespace XSD पर एक नजर है, तो आप केवल तीन अलग अलग विन्यास प्रकार के होते हैं कि यह दिखाई देगा: fixed-delay, fixed-rate और cron

और यदि आप ScheduledTasksBeanDefinitionParser के स्रोत को देखते हैं, तो आप देखेंगे कि इनमें से किसी एक मान का मूल्यांकन नहीं किया गया है। यहां प्रासंगिक भाग है:

String cronAttribute = taskElement.getAttribute("cron"); 
if (StringUtils.hasText(cronAttribute)) { 
    cronTaskMap.put(runnableBeanRef, cronAttribute); 
} 
else { 
    String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); 
    if (StringUtils.hasText(fixedDelayAttribute)) { 
     fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); 
    } 
    else { 
     String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); 
     if (!StringUtils.hasText(fixedRateAttribute)) { 
      parserContext.getReaderContext().error(
        "One of 'cron', 'fixed-delay', or 'fixed-rate' is required", 
        taskElement); 
      // Continue with the possible next task element 
      continue; 
     } 
     fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); 
    } 
} 

इसलिए इन विशेषताओं को गठबंधन करने का कोई तरीका नहीं है। संक्षेप में: नामस्थान आपको वहां नहीं ले जाएगा।

13

मेरे काम कर उदाहरण:

<bean id="whateverTriggerAtStartupTime" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="whateverJob"/> 
    <property name="repeatCount" value="0"/> 
    <property name="repeatInterval" value="10"/> 
</bean> 
3

यह काम करता है और जिस तरह से अन्य उत्तर की तुलना में आसान है।

<task:scheduled-tasks> 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run on startup 
        and not run again for 3E8 years --> 
    <task:scheduled ref="myThing" method="doStuff" 
       fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" /> 
</task:scheduled-tasks> 

(बेशक, अगर आपको लगता है कि आपके कोड में जा रहा है:

// Will fire the trigger 1 + repeatCount number of times, start delay is in milliseconds 
    simple name: 'mySimpleTrigger', startDelay: 5000, repeatCount: 0 
+1

यह वाक्यविन्यास क्या है? –

15

आप एक प्रारंभिक देरी की जरूरत नहीं है, तो आप इस प्रकार के रूप में यह स्टार्टअप पर चलने 'सिर्फ एक बार' कर सकते हैं 3E8 years से अधिक के लिए चलाएं, आपको एक अलग दृष्टिकोण की आवश्यकता हो सकती है ...)

यदि आपको प्रारंभिक देरी की आवश्यकता है, तो आप इसे निम्नानुसार कॉन्फ़िगर कर सकते हैं (मैं वसंत 3.1.1 के साथ परीक्षण कर रहा हूं) - इसकी आवश्यकता नहीं है कोई अतिरिक्त निर्भरता और आपको अपना खुद का ट्रिगर लिखना नहीं है, लेकिन आपको 01 को कॉन्फ़िगर करना होगास्प्रिंग द्वारा प्रदान की:

<bean id="onstart" class="org.springframework.scheduling.support.PeriodicTrigger" > 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run 5s after startup and 
       not run again for 3E8 years --> 
    <constructor-arg name="period" value="#{ T(java.lang.Long).MAX_VALUE }" /> 
    <property name="initialDelay" value="5000" /> 
</bean> 
<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" trigger="onstart" /> 
</task:scheduled-tasks> 

स्प्रिंग 3.2 प्रकट होता है "प्रारंभिक-देरी" सीधे विशेषता समर्थन करने के लिए है, लेकिन मैं यह परीक्षण नहीं किया; मुझे लगता है कि यह काम करता है:

<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" 
         fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" 
         initial-delay="5000"/> 
</task:scheduled-tasks> 
संबंधित मुद्दे