تسلسل الأعمال

يتيح لك WorkManager إنشاء سلسلة عمل وإضافتها إلى قائمة الانتظار تحدد المهام التابعة المتعددة وتحدد الترتيب الذي يجب تشغيلها فيه. هذه الوظيفة مفيدة بشكل خاص عندما تحتاج إلى تشغيل عدة مهام بترتيب معين.

لإنشاء سلسلة عمل، يمكنك استخدام WorkManager.beginWith(OneTimeWorkRequest) أو WorkManager.beginWith(List<OneTimeWorkRequest>) ، والتي يعرض كل منها مثيل WorkContinuation.

يمكن بعد ذلك استخدام WorkContinuation لإضافة مثيلات OneTimeWorkRequest تابعة باستخدام then(OneTimeWorkRequest) أو then(List<OneTimeWorkRequest>) .

يؤدي كل استدعاء لـ WorkContinuation.then(...) إلى عرض مثيل جديد من WorkContinuation. في حال إضافة List من إجمالي OneTimeWorkRequest مثيل، من المحتمل أن يتم تنفيذ هذه الطلبات بالتوازي.

أخيرًا، يمكنك استخدام الإجراء WorkContinuation.enqueue() من أجل enqueue() سلسلة WorkContinuation.

لنلقِ نظرة على مثال ما. في هذا المثال، يتم تهيئة 3 مهام عاملة مختلفة للتشغيل (من المحتمل أن تكون بالتوازي). يتم بعد ذلك ضم نتائج هؤلاء العاملين وتمريرها إلى مهمة عامل تخزين مؤقت. وأخيرًا، يتم تمرير ناتج تلك الوظيفة إلى عامل تحميل، الذي يحمِّل النتائج إلى خادم بعيد.

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 في CurrentWorkPolicy.

عند إنشاء سلاسل من طلبات العمل، يجب أن تحدد طلبات العمل التابعة سياسات إعادة المحاولة لضمان إنجاز العمل دائمًا في الوقت المناسب. قد تؤدي طلبات العمل غير الناجحة إلى سلاسل غير مكتملة و/أو حالة غير متوقعة.

لمزيد من المعلومات، يُرجى الاطّلاع على إلغاء العمل وإيقافه.