चेन बनाने का काम

WorkManager की मदद से, एक साथ कई टास्क को शेड्यूल किया जा सकता है. इसमें एक टास्क के पूरा होने के बाद ही दूसरा टास्क शुरू होता है. साथ ही, यह भी तय किया जा सकता है कि टास्क किस क्रम में पूरे होने चाहिए. यह सुविधा खास तौर पर तब काम आती है, जब आपको कई टास्क एक खास क्रम में चलाने हों.

काम की चेन बनाने के लिए, WorkManager.beginWith(OneTimeWorkRequest) या WorkManager.beginWith(List<OneTimeWorkRequest>) का इस्तेमाल किया जा सकता है. ये दोनों, WorkContinuation का एक इंस्टेंस दिखाते हैं.

इसके बाद, WorkContinuation का इस्तेमाल करके, OneTimeWorkRequest के डिपेंडेंट इंस्टेंस जोड़े जा सकते हैं. इसके लिए, then(OneTimeWorkRequest) या then(List<OneTimeWorkRequest>) का इस्तेमाल करें.

WorkContinuation.then(...) को हर बार कॉल करने पर, WorkContinuation का नया इंस्टेंस मिलता है. OneTimeWorkRequest इंस्टेंस का List जोड़ने पर, ये अनुरोध एक साथ चल सकते हैं.

आखिर में, WorkContinuation की चेन को enqueue() करने के लिए, WorkContinuation.enqueue() तरीके का इस्तेमाल किया जा सकता है.

आइए, एक उदाहरण देखें. इस उदाहरण में, तीन अलग-अलग वर्कर जॉब को एक साथ चलाने के लिए कॉन्फ़िगर किया गया है. इसके बाद, इन वर्कर के नतीजों को एक साथ जोड़ दिया जाता है और कैश मेमोरी में सेव करने वाले वर्कर जॉब को भेज दिया जाता है. आखिर में, उस जॉब का आउटपुट, अपलोड करने वाले वर्कर को भेजा जाता है. यह वर्कर, नतीजों को रिमोट सर्वर पर अपलोड करता है.

Kotlin

WorkManager.getInstance(myContext)
   // Candidates to run in parallel
   .beginWith(listOf(plantName1, plantName2, plantName3))
   // Dependent work (only runs after all previous work in chain)
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue()

Java

WorkManager.getInstance(myContext)
   // Candidates to run in parallel
   .beginWith(Arrays.asList(plantName1, plantName2, plantName3))
   // Dependent work (only runs after all previous work in chain)
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue();

इनपुट मर्ज करने की सुविधा

OneTimeWorkRequest के इंस्टेंस को एक साथ इस्तेमाल करने पर, पैरंट के काम से जुड़े अनुरोधों का आउटपुट, बच्चों को इनपुट के तौर पर दिया जाता है. इसलिए, ऊपर दिए गए उदाहरण में, plantName1, plantName2, और plantName3 के आउटपुट को cache अनुरोध के इनपुट के तौर पर पास किया जाएगा.

WorkManager, एक से ज़्यादा पैरंट वर्क अनुरोधों से मिले इनपुट को मैनेज करने के लिए, InputMerger का इस्तेमाल करता है.

WorkManager, दो तरह के InputMerger उपलब्ध कराता है:

  • OverwritingInputMerger सभी इनपुट से सभी कुंजियों को आउटपुट में जोड़ने की कोशिश करता है. अगर कुंजियों के बीच गड़बड़ी होती है, तो यह पहले से सेट की गई कुंजियों को ओवरराइट कर देता है.

  • ArrayCreatingInputMerger इनपुट को मर्ज करने की कोशिश करता है. साथ ही, ज़रूरत पड़ने पर ऐरे बनाता है.

अगर आपको किसी खास मामले में इसका इस्तेमाल करना है, तो InputMerger को सबक्लास करके, खुद का प्रॉम्प्ट लिखा जा सकता है.

OverwritingInputMerger

OverwritingInputMerger, मर्ज करने का डिफ़ॉल्ट तरीका है. अगर मर्ज करने के दौरान कुंजियों में कोई टकराव होता है, तो किसी कुंजी की नई वैल्यू, आउटपुट डेटा में मौजूद किसी भी पिछले वर्शन को ओवरराइट कर देगी.

उदाहरण के लिए, अगर हर प्लांट इनपुट में एक ऐसी कुंजी है जो उनके वैरिएबल के नाम ("plantName1", "plantName2", और "plantName3") से मेल खाती है, तो cache वर्कर को पास किए गए डेटा में तीन की-वैल्यू पेयर होंगे.

डायग्राम में दिखाया गया है कि तीन जॉब, चेन में अगली जॉब को अलग-अलग आउटपुट पास कर रही हैं. तीनों आउटपुट में अलग-अलग कुंजियां होने की वजह से, अगले जॉब को तीन कुंजी/वैल्यू पेयर मिलते हैं.

अगर कोई टकराव होता है, तो “जीत” उस वर्कर की होती है जिसने काम सबसे आखिर में पूरा किया है. साथ ही, उसकी वैल्यू cache को पास कर दी जाती है.

डायग्राम में दिखाया गया है कि तीन जॉब, चेन में मौजूद अगली जॉब को आउटपुट पास कर रही हैं. इस मामले में, उन दो नौकरियों से एक ही कुंजी के साथ आउटपुट जनरेट होता है. इस वजह से, अगले काम को दो की/वैल्यू पेयर मिलते हैं. इनमें से एक आउटपुट को हटा दिया जाता है.

आपके काम के अनुरोधों को एक साथ चलाया जाता है. इसलिए, इस बात की कोई गारंटी नहीं है कि वे किस क्रम में चलेंगे. ऊपर दिए गए उदाहरण में, plantName1 में "tulip" या "elm" में से कोई भी वैल्यू हो सकती है. यह इस बात पर निर्भर करता है कि आखिर में कौनसी वैल्यू लिखी गई है. अगर आपको लगता है कि कुंजियों में टकराव हो सकता है और आपको मर्ज किए गए डेटा में सभी आउटपुट डेटा को सुरक्षित रखना है, तो ArrayCreatingInputMerger एक बेहतर विकल्प हो सकता है.

ArrayCreatingInputMerger

ऊपर दिए गए उदाहरण में, हमें सभी प्लांट नेम वर्कर के आउटपुट को बनाए रखना है. इसलिए, हमें ArrayCreatingInputMerger का इस्तेमाल करना चाहिए.

Kotlin

val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>()
   .setInputMerger(ArrayCreatingInputMerger::class)
   .setConstraints(constraints)
   .build()

Java

OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class)
       .setInputMerger(ArrayCreatingInputMerger.class)
       .setConstraints(constraints)
       .build();

ArrayCreatingInputMerger हर कुंजी को एक कलेक्शन के साथ जोड़ता है. अगर हर कुंजी यूनीक है, तो आपका नतीजा एक एलिमेंट वाले ऐरे की सीरीज़ होगा.

डायग्राम में दिखाया गया है कि तीन जॉब, चेन में अगली जॉब को अलग-अलग आउटपुट पास कर रही हैं. अगले जॉब को तीन ऐरे पास किए जाते हैं. इनमें से हर एक, आउटपुट कुंजियों के लिए होता है. हर ऐरे में सिर्फ़ एक सदस्य होता है.

अगर कोई की कोलिज़न होता है, तो उससे जुड़ी सभी वैल्यू को एक ऐरे में ग्रुप किया जाता है.

डायग्राम में दिखाया गया है कि तीन जॉब, चेन में मौजूद अगली जॉब को आउटपुट पास कर रही हैं. इस मामले में, उन दो नौकरियों से एक ही कुंजी के साथ आउटपुट जनरेट होता है. अगले काम में दो ऐरे पास किए जाते हैं. हर कुंजी के लिए एक ऐरे होता है. उनमें से एक ऐरे में दो सदस्य हैं, क्योंकि उस कुंजी के साथ दो आउटपुट थे.

चेनिंग और काम की स्थितियां

OneTimeWorkRequest की चेन, क्रम से तब तक चलती रहती हैं, जब तक उनका काम पूरा नहीं हो जाता. इसका मतलब है कि वे Result.success() दिखाती हैं. काम के अनुरोध पूरे न होने या रद्द होने पर, उन पर निर्भर काम के अनुरोधों पर असर पड़ता है.

जब काम के अनुरोधों की चेन में पहला OneTimeWorkRequest शामिल किया जाता है, तो काम के सभी बाद के अनुरोध तब तक ब्लॉक कर दिए जाते हैं, जब तक कि पहले अनुरोध का काम पूरा नहीं हो जाता.

डायग्राम में, नौकरियों की एक चेन दिखाई गई है. पहला काम कतार में रखा जाता है. इसके बाद के सभी काम तब तक ब्लॉक रहते हैं, जब तक पहला काम पूरा नहीं हो जाता.

जब अनुरोध को लाइन में लगा दिया जाता है और काम से जुड़ी सभी शर्तें पूरी हो जाती हैं, तब काम का पहला अनुरोध शुरू हो जाता है. अगर रूट OneTimeWorkRequest या List<OneTimeWorkRequest> में काम पूरा हो जाता है (यानी कि यह Result.success() दिखाता है), तो निर्भरता वाले काम के अनुरोधों का अगला सेट, लाइन में लग जाएगा.

डायग्राम में, नौकरियों की एक चेन दिखाई गई है. पहली नौकरी पूरी हो गई है और इसके बाद की दो नौकरियों को लाइन में लगा दिया गया है. जब तक पिछले जॉब पूरे नहीं हो जाते, तब तक बाकी जॉब ब्लॉक रहते हैं.

जब तक काम से जुड़ा हर अनुरोध पूरा नहीं हो जाता, तब तक यह पैटर्न काम से जुड़े अनुरोधों की आपकी चेन में दिखता रहता है. ऐसा तब तक होता है, जब तक चेन में मौजूद सभी काम पूरे नहीं हो जाते. यह सबसे आसान और अक्सर पसंद किया जाने वाला तरीका है. हालांकि, गड़बड़ी की स्थितियों को मैनेज करना भी उतना ही ज़रूरी है.

अगर वर्कर आपके काम के अनुरोध को प्रोसेस करते समय कोई गड़बड़ी होती है, तो बैकऑफ़ नीति के मुताबिक, उस अनुरोध को फिर से भेजा जा सकता है. इस नीति को आपको तय करना होता है. चेन का हिस्सा होने वाले किसी अनुरोध को फिर से करने का मतलब है कि सिर्फ़ उस अनुरोध को दिए गए इनपुट डेटा के साथ फिर से किया जाएगा. समानांतर रूप से चल रहे किसी भी काम पर इसका कोई असर नहीं पड़ेगा.

डायग्राम में, नौकरियों की एक चेन दिखाई गई है. कोई एक जॉब पूरा नहीं हो सका, लेकिन उसके लिए बैकऑफ़ नीति तय की गई थी. वह जॉब, तय समय के बाद फिर से चलेगी. जब तक यह जॉब पूरी नहीं हो जाती, तब तक चेन में इसके बाद की जॉब ब्लॉक रहती हैं.

फिर से कोशिश करने की कस्टम रणनीतियां तय करने के बारे में ज़्यादा जानने के लिए, फिर से कोशिश करने और बैकऑफ़ करने की नीति देखें.

अगर फिर से कोशिश करने की नीति तय नहीं की गई है या वह खत्म हो गई है या किसी अन्य वजह से OneTimeWorkRequest, Result.failure() दिखाता है, तो काम के उस अनुरोध और उससे जुड़े सभी अनुरोधों को FAILED. के तौर पर मार्क कर दिया जाता है

डायग्राम में, नौकरियों की एक चेन दिखाई गई है. एक जॉब पूरी नहीं हो सकी और उसे फिर से नहीं किया जा सकता. इस वजह से, चेन में इसके बाद के सभी जॉब भी पूरे नहीं हो पाते.

OneTimeWorkRequest को रद्द करने पर भी यही तरीका लागू होता है. डिपेंडेंट वर्क के सभी अनुरोधों को भी CANCELLED के तौर पर मार्क किया जाता है. साथ ही, उनके काम को पूरा नहीं किया जाएगा.

डायग्राम में, नौकरियों की एक चेन दिखाई गई है. एक नौकरी रद्द कर दी गई है. इस वजह से, चेन में इसके बाद के सभी जॉब भी रद्द हो जाते हैं.

ध्यान दें कि अगर आपको किसी ऐसी चेन में काम के और अनुरोध जोड़ने हैं जिसके अनुरोध पूरे नहीं किए जा सके या रद्द कर दिए गए हैं, तो काम के लिए जोड़े गए नए अनुरोध को भी क्रमशः FAILED या CANCELLED के तौर पर मार्क किया जाएगा. अगर आपको किसी मौजूदा चेन के काम को बढ़ाना है, तो ExistingWorkPolicy में APPEND_OR_REPLACE देखें.

काम से जुड़े अनुरोधों की चेन बनाते समय, निर्भर अनुरोधों के लिए फिर से कोशिश करने की नीतियां तय की जानी चाहिए. इससे यह पक्का किया जा सकेगा कि काम हमेशा समय पर पूरा हो. अनुरोध पूरे न होने की वजह से, चेन अधूरी रह सकती हैं और/या उनकी स्थिति में बदलाव हो सकता है.

ज़्यादा जानकारी के लिए, टास्क रद्द करना और रोकना लेख पढ़ें.