2012-06-05 10 views
11

मैंने नौकरी को अपरिपक्व फेंकने पर, सीरेटिन की मात्रा के बाद नौकरी को फिर से शुरू करने के तरीके के बारे में एक उत्तर खोजा है। मैं ऐसा करने का कोई आसान तरीका नहीं देख सकता।अगर नौकरी अपवाद के साथ विफल रहता है तो 15 मिनट के बाद quartz.net ट्रिगर को रिफायर करें

अगर मैं इस तरह मेरे ट्रिगर सेट अप:

JobDetail job = new JobDetail("Download catalog", null, typeof(MyJob)); 
job .Durable = true; 
Trigger trigger= TriggerUtils.MakeDailyTrigger(12, 0); 
trigger.StartTimeUtc = DateTime.UtcNow; 
trigger.Name = "trigger name"; 
scheduler.ScheduleJob(job , trigger); 

और इस तरह दिखना MyJob:

public class MyJob : IJob 
{ 
    public void Execute(JobExecutionContext context) 
    { 
     var service = new service(); 


     try 
     { 
      service.Download(); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 

    } 
} 

वहाँ 15 मिनट यदि चला गया है के बाद मैं कैसे/retrigger Refire को ट्रिगर कर सकता हूँ सेवा। डाउनलोड() कॉल किसी प्रकार की अपवाद फेंकता है?

उत्तर

6

मुझे लगता है कि एकमात्र विकल्प आपके पास करने के लिए जाल त्रुटि है और Quartz.net बता तुरंत Refire रहे हैं:

public class MyJob : IJob 
{ 
    public void Execute(JobExecutionContext context) 
    { 
     var service = new service(); 

     try 
     { 
      service.Download(); 
     } 
     catch (Exception ex) 
     { 
       JobExecutionException qe = new JobExecutionException(ex); 
       qe.RefireImmediately = true; // this job will refire immediately 
       throw qe; 
     } 
    } 
} 

आप कुछ जानकारी here और here पा सकते हैं।

अद्यतन:

मैं कुछ परीक्षण किया था और ऐसा लगता है कि आप एक को क्रियान्वित करने का काम अंदर एक नया ट्रिगर निर्धारित कर सकते हैं।

public class MyJob : IJob 
{ 
    public void Execute(JobExecutionContext context) 
    { 
     var service = new service(); 

     try 
     { 
      service.Download(); 
     } 
     catch (Exception ex) 
     { 
      JobExecutionException qe = new JobExecutionException(ex); 
      // qe.RefireImmediately = true; // this job will refire immediately 
      // throw qe; 
      OnErrorScheduleJob(context); 

     } 
    } 

    private void OnErrorScheduleJob(JobExecutionContext context) 
    { 
     var jobOnError = context.Scheduler.GetJobDetail("ONERRORJOB", "ERROR"); 
     if (jobOnError == null) 
     { 
     JobDetail job = new JobDetail("ONERRORJOB", "ERROR", typeof(MyJob)); 
     job.Durable = false; 
     job.Volatile = false; 
     job.RequestsRecovery = false; 

     SimpleTrigger trigger = new SimpleTrigger("ONERRORTRIGGER", 
         "ERROR", 
         DateTime.UtcNow.AddMinutes(15), 
         null, 
         1, 
         TimeSpan.FromMinutes(100)); 

     context.Scheduler.ScheduleJob(job, trigger);  
     } 
    } 
} 
+0

हाँ। मैंने यह पढ़ा है, लेकिन यह एक अच्छा समाधान नहीं है, क्योंकि इसका संभावित अर्थ यह हो सकता है कि यह कई हज़ार बार (या लाखों बार भी रिफायर) करेगा। लेकिन यह देखने के लिए अच्छा है कि आप इस निष्कर्ष पर आ गए हैं। – mslot

+0

@mslot: मैंने अपना जवाब अपडेट कर लिया है। – LeftyX

+0

धन्यवाद: डी मेरे पास एक ही विचार था, लेकिन यह क्वार्ट्ज का उपयोग करने वाला मेरा पहला समय है, इसलिए मुझे यकीन नहीं था कि आप संदर्भ का उपयोग कर सकते हैं या नहीं। – mslot

19

वास्तव में इसके लिए आवश्यक नहीं है एक नया JobDetail बनाने के लिए LeftyX द्वारा वर्णित की तरह,:
आप कुछ इस तरह की कोशिश कर सकते हैं। आप वर्तमान संदर्भ से जॉबडेल से जुड़े एक नए ट्रिगर को शेड्यूल कर सकते हैं।

public void Execute(JobExecutionContext context) { 
    try { 
     // code 
    } catch (Exception ex) { 
     SimpleTriggerImpl retryTrigger = new SimpleTriggerImpl(Guid.NewGuid().ToString());  
     retryTrigger.Description = "RetryTrigger"; 
     retryTrigger.RepeatCount = 0; 
     retryTrigger.JobKey = context.JobDetail.Key; // connect trigger with current job  
     retryTrigger.StartTimeUtc = DateBuilder.NextGivenSecondDate(DateTime.Now, 30); // Execute after 30 seconds from now 
     context.Scheduler.ScheduleJob(retryTrigger); // schedule the trigger 

     JobExecutionException jex = new JobExecutionException(ex, false); 
     throw jex; 
    } 
} 

यह एक नया जॉबडिंट बनाने से कम त्रुटि है। उम्मीद है की वो मदद करदे।

5

मुझे लगता है कि सही उत्तर नौकरी को फिर से प्रयास करने के लिए जॉबलिस्टर का उपयोग करना है: http://thecodesaysitall.blogspot.cz/2012/03/quartz-candy-part-1.html

आप इस समाधान में स्वयं नौकरी से पुनः प्रयास तर्क अलग करते हैं, इसलिए इसका पुन: उपयोग किया जा सकता है।

यदि आप यहां किसी अन्य उत्तरों में सुझाए गए अनुसार नौकरी में पुनः प्रयास तर्क लागू करते हैं, तो इसे हर नौकरी में फिर से लागू किया जाना चाहिए।

+2

मैं सहमत हूं। स्वीकृत उत्तर एक "बेल्ट और ब्रेसिज़" समाधान है (जो ठीक है यदि आपको केवल नौकरी पाने की आवश्यकता है), लेकिन "पुनः प्रयास श्रोता" जोड़ना बेहतर (और अधिक पुनः उपयोग करने योग्य) दीर्घकालिक समाधान हो सकता है। मुझे नहीं लगता कि कार्यान्वयन सही है, लेकिन यह शुरू करने के लिए अच्छी जगह है ... गिटहब पर स्रोत: https://github.com/malmgren80/Quartz.Candy –

संबंधित मुद्दे