2011-08-11 7 views
15

मैं क्वार्ट्ज क्रोनट्रिगर सुविधा का उपयोग कर रहा हूं ताकि यह निर्धारित किया जा सके कि एक विशिष्ट नौकरी कब चलनी चाहिए। मैं वास्तव में नौकरी निर्धारित करने के लिए क्वार्ट्ज का उपयोग नहीं कर रहा हूं।क्वार्ट्ज क्रोनट्रिगर - अगली आग का समय

क्रोनट्रिगर में एक विधि है जिसे GetFireTimeAfter (दिनांक) कहा जाता है जो अगली बार दी गई तारीख के बाद नौकरी आग लग जाएगी। यह अच्छी तरह से काम करता है जब आपूर्ति की तारीख अब या भविष्य में है। लेकिन अगर तारीख अतीत में है तो यह काम नहीं कर रहा है।

Date currTime = new Date(); 
CronTrigger tr = new CronTrigger(); 
tr.setCronExpression("0 0 23 3,18 * ? *"); 
Date nextFireAt = tr.getFireTimeAfter(currTime); 
System.out.println("Reference time: " + currTime); 
System.out.println("Next fire after reference time: " + nextFireAt); 

कौन सा 3 और हर महीने की 18 पर 23:00 पर आग एक क्रोन शेड्यूल है। उदाहरण के लिए, अगर मैं यह आज (11 अगस्त) किया था, मैं देख रहा हूँ:

Reference time: Thu Aug 11 10:04:25 MDT 2011 
Next fire after reference time: Thu Aug 18 23:00:00 MDT 2011 

लेकिन अगर मैं अतीत के संदर्भ तिथि निर्धारित, यह मेरे लिए एक ही अगले आग समय देता है।

Reference time: Wed Dec 31 17:00:00 MST 1969 
Next fire after reference time: Thu Aug 18 23:00:00 MDT 2011 

मैं उम्मीद कर रहा था उत्पादन होने के लिए:

Reference time: Wed Dec 31 17:00:00 MST 1969 
Next fire after reference time: Wed Aug 3 23:00:00 MDT 2011 

विधि सिर्फ इतना है कि जिस तरह से काम करने के लिए या मैं कुछ गलत कर रहा हूँ इरादा नहीं है?

धन्यवाद!

+1

अगस्त 3 अतीत में है। – Kal

+0

@ काल - हाँ मुझे पता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि दिए गए दिनांक के बाद ट्रिगर कब निकाल दिया जाएगा, भले ही यह अतीत में हो। – cambo

उत्तर

27

क्या तुम सच में CronExpression वस्तु सीधे का उपयोग नहीं करने के लिए CronTrigger चाहते हैं। जैसा कि आपने पाया है, यह अतीत में अगले रन समय की गणना नहीं करेगा ... लेकिन क्रोनएक्सप्रेस होगा!

क्रोनएक्सप्रेस में विधि है: getNextValidTimeAfter। आप यही चाहते हैं।

+0

हां! यही वही है जो मैं ढूंढ रहा हूं! धन्यवाद! – cambo

+0

क्या कोई समय-समय सीमा के भीतर सभी अवसरों को खोजने का कोई तरीका है? –

+0

@ManikArora: आप थोड़ी देर लूप कॉलिंग कर सकते हैं getNextValidTime पहले पैरामीटर के रूप में गुजरने के बाद पैरामीटर के रूप में गुजरने के बाद, और फिर प्रत्येक पुनरावृत्ति पर सभी टाइमस्टैम्प लौटाए जाते हैं, और आप लूप करते हैं जबकि उन टाइमस्टैम्प अभी भी अंत समय से कम हैं। प्रत्येक पुनरावृत्ति पर आप परिणामी तिथियों को घटनाओं की सूची में जोड़ सकते हैं। – cvacca

0

Quartz doc के अनुसार:

अगली बार जिस पर CronTrigger सक्रिय होंगे रिटर्न, दिए गए समय

के बाद "को सक्रिय कर देगा" का अर्थ है "भविष्य में"। यही है, अगली बार CronTrigger आग अतीत में नहीं होगी, और अतीत की तिथियां वापस नहीं आती हैं।

मैं बिल्कुल पता नहीं है कि तुम क्या acheieve की कोशिश कर रहे हैं, लेकिन आप रात उन तरीकों में रुचि हो:

  • getPreviousFireTime(): पिछली बार ट्रिगर निकाल दिया गया था
  • getTimeBefore रिटर्न() : समय ट्रिगर एक दिया तारीख से पहले निकाल दिया (अतीत में काम करता है) देता है - ध्यान दें: इस एक के लिए लागू नहीं किया गया प्रतीत हो रहा है अब
+0

मैं यह जानने के लिए क्रोनट्रिगर का उपयोग करने की कोशिश कर रहा हूं कि कोई निश्चित "देय तिथि" हो गई है या नहीं। मेरे पास जानकारी के दो टुकड़े "आखिरी देय दिनांक समय" और क्रॉन शेड्यूल हैं। तो मैं क्या करना चाहता हूं, मुझे यह बताने के लिए getFireTimeAfter (lastDueDate) प्राप्त करें कि क्या मैं वर्तमान देय तिथि से पहले हूं या नहीं। ऐसा लगता है कि getTimeBefore() हो सकता है जो मैं खोज रहा हूं - बहुत बुरा यह अभी तक लागू नहीं हुआ है। – cambo

1

CronTrigger.getFireTimeAfter() विधि में अतीत में निर्दिष्ट समय को रोकने के लिए सुरक्षा तंत्र है।

यह आपके द्वारा मूल्यांकन किए जा रहे समय के साथ setStartTime फ़र्थ को कॉल करके अवरुद्ध किया जा सकता है। फिर getFireTimeAfter पर कॉल वैध परिणाम के साथ वापस आना चाहिए।

0

यह अजीब तरह का है लेकिन सुरक्षा तंत्र मौजूद है। कोई विचार नहीं कि क्वार्ट्ज टीम के पास यह चेक क्यों है।नीचे दिए गए परीक्षण केवल गुजरता अगर मैं nxtDay (nxtDay = nxtTrigger.Value.DateTime.AddHours(1);) के लिए एक घंटे जोड़ने

var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 

//FREQUENCY OF SECONDS 
var reccurrence = new Reccurrence 
{ 
    StartTime = new TimeSpan(9, 0, 0), 
    StopTime = new TimeSpan(11, 0, 0), 
    WeekDay = "MON-SUN", 
    TimeZoneInfo = timeZoneInfo, 
    Frequency = 15, 
    FrequencyUnit = FrequencyUnit.Seconds 
}; 

var autoPublishDetail = new AutoPublishJobDetail("TestReccurence_Seconds", _log, null, reccurrence); 
var trigger = autoPublishDetail.GetDailyTrigger(); 
var nxt = trigger.GetNextFireTimeUtc(); 

var jobSeconds = JobBuilder.Create().WithIdentity(new JobKey("TestReccurence_Seconds")).OfType(typeof(AutoPublishJob)).Build(); 

_scheduler.ScheduleJob(jobSeconds, trigger); 

//This job sud run 4 times in a 60 secs and from 9 am to 11 am (Span of 3 hrs including 11 onwards to 11:59:59) 
//Total runs = 4 x 60 x 3 = 720 
var today = DateTime.Now; 
var tomorrow = today.AddDays(1); 
DateTime? nxtDay = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day); 

int jobCnt = 0; 
do 
{ 
    var nxtTrigger = trigger.GetFireTimeAfter(nxtDay.Value); 

    if (nxtTrigger.Value.Year.Equals(today.AddDays(2).Year) && nxtTrigger.Value.Month.Equals(today.AddDays(2).Month) && nxtTrigger.Value.Day.Equals(today.AddDays(2).Day)) 
     break; 

    jobCnt++; 
    nxtDay = nxtTrigger.Value.DateTime.AddHours(1); 

} while (true); 

Assert.AreEqual(720, jobCnt); 
3

वसंत में आप एक ही दृष्टिकोण उनके एकीकरण परीक्षणों में वे का उपयोग पालन कर सकते हैं। CronTriggerTests

CronTrigger trigger = new CronTrigger(); 
trigger.setCronExpression("0 0 23 3,18 * ? *"); 
SimpleTriggerContext triggerContext = new SimpleTriggerContext(); 
triggerContext.update(null, null, new Date()); 
Date nextFireAt = trigger.nextExecutionTime(triggerContext); 
संबंधित मुद्दे