زنجیر کردن کارها

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 استفاده کنید.

بیایید به یک مثال نگاه کنیم. در این مثال، ۳ کار Worker مختلف برای اجرا پیکربندی شده‌اند (احتمالاً به‌صورت موازی). سپس نتایج این Workerها به‌هم می‌پیوندند و به کار Worker ذخیره‌سازی در حافظه نهان منتقل می‌شوند. درنهایت، خروجی آن کار به یک Worker بارگذاری منتقل می‌شود که نتایج را به یک سرور راه دور بارگذاری می‌کند.

کاتلین

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()

جاوا

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 استفاده می‌کند.

دو نوع مختلف InputMerger وجود دارد که WorkManager ارائه می‌دهد:

  • OverwritingInputMerger تلاش می‌کند همه کلیدها را از همه ورودی‌ها به خروجی اضافه کند. درصورت وجود تداخل، کلیدهای قبلاً تنظیم‌شده را بازنویسی می‌کند.

  • ArrayCreatingInputMerger تلاش می‌کند ورودی‌ها را ادغام کند و درصورت لزوم آرایه ایجاد می‌کند.

اگر مورد استفاده خاص‌تری دارید، می‌توانید با زیرکلاس‌بندی InputMerger، مورد استفاده خودتان را بنویسید.

OverwritingInputMerger

OverwritingInputMerger روش ادغام پیش‌فرض است. اگر در ادغام تداخل کلید وجود داشته باشد، آخرین مقدار برای کلید، نسخه‌های قبلی را در داده‌های خروجی حاصل بازنویسی می‌کند.

برای مثال، اگر ورودی‌های کارخانه هرکدام کلیدی داشته باشند که با نام متغیر مربوطه آن‌ها ("plantName1"، "plantName2"، و "plantName3") مطابقت داشته باشد، داده‌های ارسال‌شده به کارگر cache دارای سه جفت کلید-مقدار خواهند بود.

نموداری که سه کار را نشان می‌دهد که بروندادهای متفاوتی را به کار بعدی در زنجیره منتقل می‌کنند. ازآنجایی‌که هر سه خروجی کلیدهای متفاوتی دارند، کار بعدی سه جفت کلید/مقدار دریافت می‌کند.

اگر تداخلی وجود داشته باشد، آخرین کارگری که تکمیل می‌کند «برنده می‌شود» و مقدار آن به cache منتقل می‌شود.

نموداری که سه کار را نشان می‌دهد که خروجی‌ها را به کار بعدی در زنجیره منتقل می‌کنند. دراین‌صورت، دو مورد از آن کارها بروندادهایی با کلید یکسان تولید می‌کنند. درنتیجه، کار بعدی دو جفت کلید/مقدار دریافت می‌کند و یکی از بروندادهای متناقض حذف می‌شود.

چون درخواست‌های کار شما به‌طور موازی اجرا می‌شوند، تضمینی برای ترتیب اجرای آن‌ها وجود ندارد. در مثال بالا، plantName1 می‌تواند مقدار "tulip" یا "elm" را داشته باشد، بسته به اینکه کدام مقدار آخر نوشته شده باشد. اگر احتمال تداخل کلید وجود دارد و باید همه داده‌های خروجی را در ادغام حفظ کنید، ArrayCreatingInputMerger ممکن است گزینه بهتری باشد.

ArrayCreatingInputMerger

برای مثال بالا، با توجه به اینکه می‌خواهیم خروجی‌های همه «کارگران» نام گیاه را حفظ کنیم، باید از ArrayCreatingInputMerger استفاده کنیم.

کاتلین

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

جاوا

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 را در ExistingWorkPolicy ببینید.

هنگام ایجاد زنجیره‌های درخواست‌های کاری، درخواست‌های کاری وابسته باید خط‌مشی‌های تکرار مجدد را تعریف کنند تا اطمینان حاصل شود که کار همیشه به‌موقع تکمیل می‌شود. درخواست‌های کاری ناموفق می‌تواند منجر به زنجیره‌های ناقص و/یا وضعیت غیرمنتظره شود.

برای اطلاعات بیشتر، لغو و توقف کار را ببینید.