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

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, मर्ज करने का डिफ़ॉल्ट तरीका है. अगर मर्ज करने के दौरान, एक ही नाम की दो या उससे ज़्यादा वैल्यू मिलती हैं, तो आउटपुट डेटा में किसी कुंजी की नई वैल्यू, पिछली सभी वैल्यू को ओवरराइट कर देगी.

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

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

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

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

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

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

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