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

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

क्रम से काम करने के लिए, WorkManager.beginWith(OneTimeWorkRequest) या WorkManager.beginWith(List<OneTimeWorkRequest>) का इस्तेमाल किया जा सकता है. इनमें से हर फ़ंक्शन, WorkContinuation का एक इंस्टेंस दिखाता है.

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

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

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

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

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

ऊपर दिए गए उदाहरण में, हमें plantname वर्कर्स के सभी आउटपुट को सेव करना है. इसके लिए, हमें 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 के तौर पर मार्क किया जाएगा. अगर आपको किसी मौजूदा चेन के काम का समय बढ़ाना है, तो मौजूदा वर्क नीति में APPEND_OR_REPLACE देखें.

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

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