2012-02-06 13 views
12

में चल रहा है मैं (Quartz1.6 में scheduler.getCurrentlyExecutingJobs का ब्यौरा स्पष्ट करने के लिए) विधि चाहते हैं। मेरे पास एक नौकरी है जिसमें किसी भी क्षण में केवल एक उदाहरण चलाना चाहिए। इसे यूआई से "अभी रन" करने के लिए ट्रिगर किया जा सकता है, लेकिन यदि नौकरी का उदाहरण पहले से ही इस नौकरी के लिए चल रहा है - कुछ भी नहीं होना चाहिए।अगर एक नौकरी Quartz1.6

यह मैं कैसे की जाँच एक नौकरी चल रहा है कि मुझे दिलचस्पी है या नहीं है:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs(); 
    for (JobExecutionContext jobCtx: currentJobs){ 
    jobName = jobCtx.getJobDetail().getName(); 
    groupName = jobCtx.getJobDetail().getGroup(); 
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && 
     groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) { 
     //found it! 
     logger.warn("the job is already running - do nothing"); 
    }    
} 

तो, यह परीक्षण करने के लिए, मैं एक इकाई परीक्षण के बाद यह काम एक के दो उदाहरणों का समय निर्धारित करने की कोशिश करता है है । मैं जब दूसरी नौकरी का समय निर्धारित करने की कोशिश कर रहा तथापि, चेतावनी को देखने के लिए उम्मीद कर रहा था, इसके बजाय, मैं इस अपवाद हो रही है:

org.quartz.ObjectAlreadyExistsException: Unable to store Job with name: 
'job_I_am_looking_for_name' and group: 'job_group_I_am_looking_for_name', 
because one already exists with this identification. 

जब मैं एक डिबग मोड में इस इकाई परीक्षण, इस लाइन पर ब्रेक के साथ चलाने :

सूची currentJobs = scheduler.getCurrentlyExecutingJobs();

मैं देख रहा हूँ सूची खाली है - तो अनुसूचक दौड़ने में ये कार्य नहीं करता है, लेकिन यह अभी भी इसे फिर से शेड्यूल करने के लिए विफल रहता है - जो मुझसे कहता है काम वास्तव में समय में चल रहा था ...

क्या मैं इस शेड्यूलर विधि के साथ कुछ बेहतर बिंदु खो रहा हूं?

धन्यवाद! posting on Terracotta's forum

यहाँ फिर से टोपी है: -

मरीना

उत्तर

18

अन्य लोगों के लाभ के लिए, मैं इस मुद्दे को मैं हो रही थी करने के लिए एक उत्तर पोस्ट कर रहा हूँ मैं टेराकोटा फोरम के Zemian देंग से मदद मिली: चल नौकरियों की वास्तविक जाँच ठीक काम कर रहा था - यह सिर्फ ज़ाहिर है, ईकाई परीक्षण में समय किया गया था। मैं काम में कुछ नींद जोड़ दिया है, और इकाई परीक्षण बदलाव दूसरा काम शेड्यूल करने के लिए है, जबकि पहले एक अभी भी चल रहा है - और सत्यापित है कि मैं वास्तव में मिल सकता है पहली नौकरी अभी भी चल रहा है।

अपवाद मैं हो रही थी था, क्योंकि मैं एक ही नाम के साथ एक नया काम का समय निर्धारित करने के बजाय पहले से ही अनुसूचक काम में संग्रहीत को गति प्रदान करने की कोशिश की कोशिश कर रहा था। निम्न कोड की आवश्यकता है जैसा कि मुझे चाहिए:

List<JobExecutionContext> currentJobs = scheduler.getCurrentlyExecutingJobs(); 
for (JobExecutionContext jobCtx: currentJobs){ 
    jobName = jobCtx.getJobDetail().getName(); 
    groupName = jobCtx.getJobDetail().getGroup(); 
    if (jobName.equalsIgnoreCase("job_I_am_looking_for_name") && groupName.equalsIgnoreCase("job_group_I_am_looking_for_name")) { 
     //found it! 
     logger.warn("the job is already running - do nothing"); 
       return; 
    }    
} 
     // check if this job is already stored in the scheduler 
JobDetail emailJob; 
emailJob = scheduler.getJobDetail("job_I_am_looking_for_name", "job_group_I_am_looking_for_name"); 
if (emailJob == null){ 
     // this job is not in the scheduler yet 
    // create JobDetail object for my job 
    emailJob = jobFactory.getObject(); 
    emailJob.setName("job_I_am_looking_for_name"); 
    emailJob.setGroup("job_group_I_am_looking_for_name"); 
    scheduler.addJob(emailJob, true);    
} 

// this job is in the scheduler and it is not running right now - run it now 
scheduler.triggerJob("job_I_am_looking_for_name", "job_group_I_am_looking_for_name"); 

धन्यवाद! मरीना

+1

बस ध्यान दें कि 'getCurrentlyExecutingJobs()' विधि के बारे में पता क्लस्टर नहीं है, तो यह करता है, तो आपके उपयोग एकल नोड क्वार्ट्ज केवल विन्यास काम करेंगे। – Marboni

+0

उपयोगी टिप के लिए धन्यवाद! – Marina

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