2016-08-25 11 views
5

मैंने सेटअप किया है जहां एकाधिक सर्वर @Schedule चलाते हैं जो एक वसंत बैच नौकरी चलाता है जो उपयोगकर्ताओं को ईमेल भेजता है। मैं यह सुनिश्चित करना चाहता हूं कि इस सर्वर का केवल एक उदाहरण एकाधिक सर्वरों पर चलाया जाए।एकाधिक सर्वरों में एकल नौकरी निष्पादन

this प्रश्न पर आधारित मैंने कुछ तर्क लागू किए हैं कि यह देखने के लिए कि क्या केवल वसंत बैच का उपयोग करके इसे हल करना संभव है या नहीं।

एक नौकरी मैं निम्न विधियों में से एक सहायक वर्ग JobRunner बनाई चलाने के लिए:

public void run(Job job) { 
    try { 
     jobLauncher.run(job, new JobParameters()); 
    } catch (JobExecutionAlreadyRunningException e) { 

     // Check if job is inactive and stop it if so. 
     stopIfInactive(job); 

    } catch (JobExecutionException e) { 
     ... 
    } 
} 

stopIfInactive विधि:

private void stopIfInactive(Job job) { 
    for (JobExecution execution : jobExplorer.findRunningJobExecutions(job.getName())) { 
     Date createTime = execution.getCreateTime(); 

     DateTime now = DateTime.now(); 

     // Get running seconds for more info. 
     int seconds = Seconds 
       .secondsBetween(new DateTime(createTime), now) 
       .getSeconds(); 

     LOGGER.debug("Job '{}' already has an execution with id: {} with age of {}s", 
       job.getName(), execution.getId(), seconds); 

     // If job start time exceeds the execution window, stop the job. 
     if (createTime.before(now.minusMillis(EXECUTION_DEAD_MILLIS) 
       .toDate())) { 

      LOGGER.warn("Execution with id: {} is inactive, stopping", 
        execution.getId()); 

      execution.setExitStatus(new ExitStatus(BatchStatus.FAILED.name(), 
        String.format("Stopped due to being inactive for %d seconds", seconds))); 

      execution.setStatus(BatchStatus.FAILED); 
      execution.setEndTime(now.toDate()); 

      jobRepository.update(execution); 
     } 
    } 
} 

और फिर जॉब सभी सर्वरों पर का पालन करके दौड़ा रहे हैं:

@Scheduled(cron = "${email.cron}") 
public void sendEmails() { 
    jobRunner.run(emailJob); 
} 

क्या यह एकाधिक सर्वर के लिए एक वैध समाधान है एट अप? यदि नहीं, तो विकल्प क्या हैं?

संपादित करें 1

मैं थोड़ा और अधिक परीक्षण किया गया है - दो आवेदन जो एक @Schedule हर 5 सेकंड है कि एक नौकरी मेरे द्वारा बनाए गए सहायक वर्ग का उपयोग कर प्रारंभ करता है चलाने सेटअप। ऐसा लगता है कि मेरा समाधान समस्या का समाधान नहीं करता है।

job_execution_id | version | job_instance_id |  create_time  |  start_time  |  end_time   | status | exit_code | exit_message |  last_updated  | job_configuration_location 
------------------+---------+-----------------+-------------------------+-------------------------+-------------------------+-----------+-----------+--------------+-------------------------+---------------------------- 
      1007 |  2 |    2 | 2016-08-25 14:43:15.024 | 2016-08-25 14:43:15.028 | 2016-08-25 14:43:16.84 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:16.84 | 
      1006 |  1 |    2 | 2016-08-25 14:43:15.021 | 2016-08-25 14:43:15.025 |       | STARTED | UNKNOWN |    | 2016-08-25 14:43:15.025 | 
      1005 |  2 |    2 | 2016-08-25 14:43:10.326 | 2016-08-25 14:43:10.329 | 2016-08-25 14:43:12.047 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:12.047 | 
      1004 |  2 |    2 | 2016-08-25 14:43:10.317 | 2016-08-25 14:43:10.319 | 2016-08-25 14:43:12.03 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:12.03 | 
      1003 |  2 |    2 | 2016-08-25 14:43:05.017 | 2016-08-25 14:43:05.02 | 2016-08-25 14:43:06.819 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:06.819 | 
      1002 |  2 |    2 | 2016-08-25 14:43:05.016 | 2016-08-25 14:43:05.018 | 2016-08-25 14:43:06.811 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:06.811 | 
      1001 |  2 |    2 | 2016-08-25 14:43:00.038 | 2016-08-25 14:43:00.042 | 2016-08-25 14:43:01.944 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:01.944 | 
      1000 |  2 |    2 | 2016-08-25 14:43:00.038 | 2016-08-25 14:43:00.041 | 2016-08-25 14:43:01.922 | COMPLETED | COMPLETED |    | 2016-08-25 14:43:01.922 | 
       999 |  2 |    2 | 2016-08-25 14:42:55.02 | 2016-08-25 14:42:55.024 | 2016-08-25 14:42:57.603 | COMPLETED | COMPLETED |    | 2016-08-25 14:42:57.603 | 
       998 |  2 |    2 | 2016-08-25 14:42:55.02 | 2016-08-25 14:42:55.023 | 2016-08-25 14:42:57.559 | COMPLETED | COMPLETED |    | 2016-08-25 14:42:57.559 | 
(10 rows) 

मैं भी कोशिश की @Palcente द्वारा प्रदान की विधि, मैं इसी तरह के परिणाम मिल गया है: यहाँ कि वसंत बैच द्वारा किया जाता है batch_job_execution तालिका से डेटा है।

+0

क्या आप उपरोक्त मामले में क्या काम नहीं कर रहे हैं? क्या आपका मतलब है कि एक ही नौकरी के कई निष्पादन एक ही समय में चल रहे हैं? – DevG

+0

हां, दोनों सर्वर एक ही समय में एक ही नौकरी शुरू करते हैं, भले ही यह अभी भी नोड्स में से किसी एक पर चल रहा/शुरू हो। – Edd

उत्तर

0

वसंत एकीकरण की नवीनतम रिलीज ने वितरित ताले के आसपास कुछ कार्यक्षमता को जोड़ा। यह वास्तव में आप यह सुनिश्चित करने के लिए उपयोग करना चाहते हैं कि केवल एक सर्वर नौकरी को सक्रिय करता है (केवल वह सर्वर जो लॉक प्राप्त करता है उसे नौकरी लॉन्च करना चाहिए)। आप यहां दस्तावेज़ों में स्प्रिंग एकीकरण की लॉकिंग क्षमताओं के बारे में अधिक पढ़ सकते हैं: http://projects.spring.io/spring-integration/

+0

मैं प्रलेखन या वसंत-एकीकरण-नमूने (https://github.com/spring-projects/spring-integration-samples) प्रोजेक्ट पर कोई उदाहरण नहीं ढूंढ पा रहा हूं जो जावा-कॉन्फ़िगरेशन का उपयोग करके इस कार्यक्षमता को दिखाता है। फिलहाल मैं एक साधारण लॉक टेबल बनाने की सोच रहा हूं। – Edd

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