मैं केवल एक सेवा उदाहरण पर एक विशिष्ट कार्य चलाने के लिए हेज़ेलकास्ट अनुसूचित निष्पादक सेवा का उपयोग कर रहा हूं। इस व्यवहार को प्राप्त करने के लिए हम डुप्लिकेट कार्यों से बचने के लिए com.hazelcast.scheduledexecutor.TaskUtils.named(java.lang.String, java.lang.Runnable) डेकोरेटर का लाभ उठाते हैं।

हेज़ेलकास्ट निर्भरता का इस्तेमाल किया:

implementation "com.hazelcast:hazelcast-all:4.2" 
implementation "com.hazelcast:hazelcast-kubernetes:2.2.2" // DNS Lookup

हम एक हेज़लकास्ट क्लस्टर का उपयोग करते हैं जिसमें प्रति सेवा उदाहरण एक सदस्य होता है

कोड उदाहरण:

public void scheduleTask() {
    IScheduledExecutorService es = hazelcastInstance.getScheduledExecutorService("myScheduledExecutor");
    try {
        es.scheduleAtFixedRate(named("taskName", task)), 0, 30, SECONDS);
    } catch (DuplicateTaskException ex) {
        System.out.println("Task was already scheduled!");
    }
}

उपरोक्त उदाहरण वांछित व्यवहार को आंशिक रूप से प्राप्त करने का प्रबंधन करता है। एकमात्र मुद्दा यह है कि हर बार जब कोई नया उदाहरण घूमता है, तो अनुसूचित निष्पादक उस विशिष्ट उदाहरण पर कार्य चलाएगा। यह आदर्श नहीं है क्योंकि हम चाहते हैं कि कार्य निष्पादित हो, उदाहरण के लिए, हर 6 घंटे में एक बार।

क्या अनुसूचित निष्पादक को कॉन्फ़िगर करने का कोई तरीका है ताकि यह मूल उदाहरण पर कार्य को चालू रखे और मूल उदाहरण के नीचे जाने पर ही किसी अन्य उदाहरण में स्थानांतरित हो जाए?

0
Cosmin 25 अगस्त 2021, 20:24

2 जवाब

सबसे बढ़िया उत्तर

मैंने जिस वर्कअराउंड का उपयोग किया था वह पहले से निर्धारित कार्य को निपटाने के लिए था और प्रारंभिक देरी के साथ फिर से शेड्यूल करना था जिसे मैं पिछली बार कार्य निर्धारित करने के आधार पर गणना करता था।

कुछ इस तरह:

public void scheduleTask() {
    IScheduledExecutorService es = hazelcastInstance.getScheduledExecutorService("myScheduledExecutor");
    try {
        disposePreviousScheduledTasks(es);
        es.scheduleAtFixedRate(named("taskName", task)), initialDelay, 30, SECONDS);
    } catch (DuplicateTaskException ex) {
        System.out.println("Task was already scheduled!");
    }
}
0
Wai Ha Lee 17 सितंबर 2021, 15:42

यह सीधे तौर पर संभव नहीं है, लेकिन एक सन्निकटन है।

IScheduledExecutorService सदस्यों को उपयोग करने के लिए एक आदेश प्रदान करने के लिए एक विधि प्रदान नहीं करता है।

  • आप किसी विशिष्ट सदस्य को कार्य सबमिट कर सकते हैं, लेकिन यदि मूल विशिष्ट सदस्य की मृत्यु हो जाती है, तो यह आपके चुने हुए सदस्य के लिए विफल नहीं होगा।
  • ... कई अन्य विकल्प ...
  • या आपके कोड में विकल्प, scheduleAtFixedRate जो एक सदस्य को चुनेगा, और यह हर बार क्लस्टर का आकार बदलने पर एक अलग सदस्य हो सकता है। यह हमेशा सबसे नया नहीं होना चाहिए जब तक कि सह-घटना न हो।

आप क्या कर सकते हैं एक निर्धारित कार्य है जो एक सामान्य कार्य को चलाने के लिए एक सदस्य का चयन करता है। एक कार्य जो दूसरे को लॉन्च करता है।

निर्धारित कार्य में, run() क्लस्टर में सदस्यों की सूची प्राप्त करने के लिए hazelcastInstance.getCluster().getMembers() को कॉल कर सकता है। किसी सदस्य को चुनने के लिए बस कुछ तर्क चाहिए, और फिर hazelcastInstance.getExecutorService("default").executeOnMember(runnable, member) करें।

आप एक विशिष्ट विशेषता वाले सदस्य को चुन सकते हैं जिसे आप कॉन्फ़िगर करते हैं। या एक विशिष्ट आईपी वाला सदस्य। शायद सबसे आसान सबसे पुराना चुनना है, क्योंकि यह सबसे पुरानी पत्तियों तक नहीं बदलता है, इस मामले में दूसरा ओलेस्ट अब सबसे पुराना, आसान विफलता है।

0
Neil Stevenson 26 अगस्त 2021, 13:30